Gsutil 在 Google Compute Engine 上的 Dockerfile 中不工作

Gsutil Not working in Dockerfile on Google Compute Engine

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

中使用 gsutil 和以下内容
# 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 Container Registry 并在 GCE 实例上使用 docker 图像时,文件在 运行ning docker 图像上不存在。

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

我做错了什么?这是一个错误吗?

感谢任何帮助!

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

您上面显示的 RUN 步骤是 运行 仅在构建图像时。 RUN 用于 运行 安装和构建容器中 运行 软件所需的步骤。当您从图像创建容器时,Run 步骤不是 运行。

因此,如果文件在 docker build 期间被正确复制,它们将在该图像 运行 时出现。你在哪里建立形象?一旦构建了图像,部署到任何地方(包括到 GCR)然后 运行ning 图像,不会影响您的展示步骤(因为它们是 运行 在图像创建期间)。

从您展示的内容来看,不清楚当您 运行 图片时会发生什么。如果这是您的 Dockerfile 的全部,那么当您 docker run.

时什么也不会发生

注意 您的方法具有安全隐患。拥有该图像的任何人都可以访问您的服务帐户密钥。对于包含密钥(可能还有 /letsencrypt/)和您的配置的数据,最好在 docker run 时引用这些数据并通常使用卷|装载。

我假设您正在使用此图像查找 运行 Apache 吗?

我怀疑您运行正在解决此处描述的问题:

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