为 gcloud 构建提交指定 Dockerfile

Posted

技术标签:

【中文标题】为 gcloud 构建提交指定 Dockerfile【英文标题】:Specify Dockerfile for gcloud build submit 【发布时间】:2020-02-08 03:35:09 【问题描述】:

我了解gcloud 使用在源(.)的根目录中指定的 Dockerfile,如下所示: gcloud builds submit --tag gcr.io/[PROJECT_ID]/quickstart-image .

但我正在尝试指定用于构建映像的 Dockerfile,但我没有找到任何有关如何执行此操作的资源,我不知道这是否可能。

【问题讨论】:

【参考方案1】:

我不确定你是否可以指定 Dockerfile,但你可以使用cloudbuild.yaml 文件。检查 gcloud documentation。如果要重命名此文件,可以使用config 选项。

    gcloud builds submit --config cloudbuild.yaml .

cloudbuild.yaml 文件示例如下所示,

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quickstart-image', '.' ]
images:
- 'gcr.io/$PROJECT_ID/quickstart-image'

【讨论】:

【参考方案2】:

指定 Dockerfile(即除 ./Dockerfile 之外)的唯一方法是为每个 techtabu@ 创建一个 cloudbuild.yaml。然后,此配置可以使用 docker 构建器并提供特定的 Dockerfile,即:

steps:
- name: "gcr.io/cloud-builders/docker"
  args:
  - build
  - "--tag=gcr.io/$PROJECT_ID/quickstart-image"
  - "--file=./path/to/YourDockerFile"
  - .
...
images:
- "gcr.io/$PROJECT_ID/quickstart-image"

如果您愿意,您还可以指定一个替代名称而不是 cloudbuild.yaml

./Dockerfile 假设可能是为了简化向 Cloud Build 的过渡。

我建议您改用cloudbuild.yaml,因为它提供了灵活性。

【讨论】:

我如何为命令指定变量?例如,向标签中的图像名称添加提交 SHA(比如 SHA 以 $CI_COMMIT_SHA 的形式提供)? 见:cloud.google.com/cloud-build/docs/configuring-builds/… 还有:docs.docker.com/engine/reference/commandline/build/… 很好的答案,谢谢@DazWilkin。不管怎样,@idrisadetunmbi,你可以在上面的链接中找到文档,或者你可以在 Dockerfile 中使用例如ENV NODE_ENV=development 来设置环境变量。【参考方案3】:

您可以通过将. 替换为./path/to/YourDockerFile 来轻松完成此操作,因此gcloud 命令将是:

gcloud builds submit --tag gcr.io/[PROJECT_ID]/quickstart-image ./path/to/YourDockerFile

因此您不必为此使用cloudbuild.yaml

【讨论】:

这对我不起作用:ERROR: (gcloud.builds.submit) Local file [src] is none of .zip, .tgz, .gz @ZaarHai 只需指定包含 dockerfile 的 目录不是文件本身的路径 这在我的用例中并没有真正的帮助——我想要一个包含两个 dockerfile 的文件夹——一个用于开发(即运行单元测试),一个用于生产。最终使用 tar --transoform。见下文。 这适用于您可以使用指定目录的构建上下文的情况。但是,对我来说,它需要来自 repo root,所以使用上面的@DazWilkin 答案【参考方案4】:

最终,以下 hack 对我来说非常有效。如果你有例如Dockerfile.prodDockerfile.dev 使用以下内容来构建后者。

tar --exclude-vcs-ignores \  # sort-of .dockerignore support
    --transform='s|^\./Dockerfile.dev|./Dockerfile|' -zcf /tmp/togo.tgz . && \
            gcloud builds submit --tag=gcr.io/my-project/foo:latest /tmp/togo.tgz

【讨论】:

【参考方案5】:

gcloud 构建提交将自动检测您的Dockerfile(如果存在),请确保将文件放在您的root directory 中。如果你对 docker 不太了解,可以使用这个命令

gcloud beta run deploy --source=.

在你的根目录执行它。 buildpacks 将创建 dockerfile 为您服务,它能够检测您的应用程序堆栈,以便使用相关工具进行构建。

【讨论】:

以上是关于为 gcloud 构建提交指定 Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

cloudbuild.yaml 上的错误:(gcloud.builds.submit)将 cloudbuild.yaml 解释为构建配置:“列表”对象没有属性“项目”

使用 GCloud 容器构建器将图像拉取并推送到另一个项目

指定要与 gcloud sql 连接的数据库

Gcloud 云构建本地组件失败并出现错误“加载配置文件时出错:cloudbuild.Build 中的未知字段“availableSecrets””

gcloud cli 无法创建项目 - 您指定的项目 ID 已被另一个项目使用

cloudbuild.yaml 中构建步骤中的 gcloud beta 命令。我应该使用入口点还是参数?