Gsutil不在Google计算引擎上的Dockerfile中工作

Gsutil不在Google计算引擎上的Dockerfile中工作,docker,google-cloud-storage,google-compute-engine,gsutil,google-container-registry,Docker,Google Cloud Storage,Google Compute Engine,Gsutil,Google Container Registry,我对Docker有点陌生,我正在尝试将资源从我的云存储桶复制到使用Docker映像创建的实例。我将gsutil与我的Dockerfile # Install Google Cloud tools - Debian https://cloud.google.com/storage/docs/gsutil_install#deb ENV CLOUD_SDK_REPO="cloud-sdk-stretch" RUN echo "deb http://packages.cloud.google.com/

我对Docker有点陌生,我正在尝试将资源从我的云存储桶复制到使用Docker映像创建的实例。我将
gsutil
与我的
Dockerfile

# Install Google Cloud tools - Debian https://cloud.google.com/storage/docs/gsutil_install#deb
ENV CLOUD_SDK_REPO="cloud-sdk-stretch"
RUN echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | \
    tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
    apt-get update && apt-get install -y google-cloud-sdk

# Setup Google Service Account
COPY service-account.json /etc/
ENV GOOGLE_APPLICATION_CREDENTIALS="/etc/service-account.json"

RUN gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS}

# Copy the last updated ssl config
RUN gsutil cp -r gs://my-project.appspot.com/docker/etc/letsencrypt /etc/ && \
    gsutil cp -r gs://my-project.appspot.com/docker/etc/apache2/sites-available /etc/apache2/
当我在本地计算机上运行此操作时,使用gsutil可以正确复制文件。(它们在我运行docker映像时存在)

当我部署到Google容器注册表并在GCE实例上使用docker映像时,运行中的docker映像上不存在文件

我可以从googlebuild日志中看到gsutil似乎工作正常,并且正在复制文件(在构建过程中)

我做错了什么?这是虫子吗


感谢您的帮助

我怀疑文件
/etc/
中,但从片段中不清楚运行图像时图像的作用

上面显示的
RUN
步骤仅在生成映像时运行<代码>运行用于运行安装和构建容器中运行的软件所需的步骤<代码>运行从图像创建容器时,不会运行步骤

因此,如果在docker build期间正确复制了文件,则在运行该映像时,这些文件将出现。你在哪里建立形象?构建映像后,在任何位置部署(包括部署到GCR)然后运行映像不会影响显示的步骤(因为它们是在映像创建期间运行的)

从您显示的内容来看,不清楚运行图像时会发生什么。如果这是docker文件的全部内容,那么当您运行
docker
时,将不会发生任何事情

NB您的方法具有安全含义。任何拥有该映像的人都可以访问您的服务帐户密钥。对于包括密钥(也可能是
/letsencrypt/
)和配置的数据,最好在
docker run
时间和常用卷装载时引用这些数据


我是否假设您希望使用此映像运行Apache?

我怀疑您遇到了此处描述的问题:


为gsutil设置的别名将在旋转容器中运行它,该容器的文件系统与主机分离。使用这个别名,如果您将某些内容复制到/etc/foo/bar,然后在主机文件系统上查找/etc/foo/bar,它将不存在。上面链接的问题包含一些解决方法。

Hmmm。。。你是对的,我在一个新的虚拟机上再次运行了这个,文件现在确实在/etc/中。我认为问题在于我在虚拟机上进行了“重置”,而不是停止/启动。我认为这会将文件系统恢复到原始状态,并会提取最新的Docker映像(我使用的是最新的标记)。我相信这会导致使用过时的映像(gsutil之前的更改)而不是更新的映像。其他时候,“重置”似乎工作正常。关于迭代构建和重新部署,Docker有一些更深层次的细微差别,它失去了同步,我不完全理解层……就安全性而言,我认为容器和gsutil文件在GCE中的相同访问模型下都是私有的和安全的。我认识到,如果我将图像共享给比访问服务帐户更广泛的受众,那么这将是泄漏访问权限。是的,在GCP中是安全的,但是。。。。你的同事和你未来的自己可能会忘记珍贵的货物,不经意间分享了这个形象(以及秘密);你会努力地每x天循环一次按键,你的图像就会损坏。我继续反对这种做法。