Gsutil 在 Google Compute Engine 上的 Dockerfile 中不起作用

Posted

技术标签:

【中文标题】Gsutil 在 Google Compute Engine 上的 Dockerfile 中不起作用【英文标题】:Gsutil Not working in Dockerfile on Google Compute Engine 【发布时间】:2019-01-19 00:58:19 【问题描述】:

我对 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 映像时,正在运行的 docker 映像上不存在文件。

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

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

任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

我怀疑文件/etc/ 中,但从 sn-p 中不清楚您的图像在运行时会做什么。

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

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

从您显示的内容来看,尚不清楚运行映像时会发生什么。如果这是你的 Dockerfile 的全部,那么当你 docker run 时什么都不会发生。

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

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

【讨论】:

嗯...你是对的,我在一个新的虚拟机上再次运行了这个,文件现在确实在 /etc/ 中。我认为问题在于我在虚拟机上进行了“重置”,而不是停止/启动。我认为这会将文件系统擦除回原始状态并会提取最新的 Docker 映像(我使用的是最新标签)。我相信这会导致使用过时的图像(预 gsutil 更改)而不是我更新的图像。其他时候,“重置”似乎可以正常工作。关于迭代构建和重新部署有一些更深层次的 Docker 细微差别,它不同步,我不完全理解这些层...... 就安全性而言,我认为容器和 gsutil 文件都是私有的,并且在 GCE 中的相同访问模型下是安全的。我认识到,如果我将图像分享给更广泛的受众,而不是访问服务帐户,那么就会泄露访问权限。 是的,它在 GCP 中是安全的,但是......您的同事和未来的自己可能会忘记宝贵的货物并无意中分享了图像(因此是秘密);您将每 x 天勤奋地循环密钥,您的图像将变得无聊。我继续反对这种方法。【参考方案2】:

我怀疑您遇到了这里描述的问题:

`gsutil cp` from Storage to compute instance running container doesn't copy files

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

【讨论】:

以上是关于Gsutil 在 Google Compute Engine 上的 Dockerfile 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Compute Engine 上使用 gcloud 安装 node.js

在 Google Cloud 函数中运行 gsutil 命令

如何在 Google Cloud Compute Engine VM Instance (Bitnami) 中查找 mongodb 连接字符串

gsutil - 如何从 google play 获取 Android 应用审查报告

Google Cloud App Engine - gsutil 访问问题

google工具安装gsutil存储管理google cloud stroge