2

所以我有一个 CloudBuild 触发器来构建我的cloudbuild.yaml文件,这一切都很好。我还使用 gcloud builder 运行 docker 命令将 ENV 变量传递给我的Dockerfile. 例如:

steps:
- name: 'gcr.io/$PROJECT_ID/swift:4.2'
  args: ['test']
  id: 'Running unit tests'

- name: 'gcr.io/cloud-builders/docker'
  args: ['build','--build-arg', 'PROJECT=$PROJECT_ID','-t', 'us.gcr.io/$PROJECT_ID/$BRANCH_NAME:$SHORT_SHA', '.']
  id: 'Building docker image'

- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "us.gcr.io/$PROJECT_ID/$BRANCH_NAME:$SHORT_SHA"]
  id: 'Pushing built image to registry'

- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy']
  id: 'Deploying to AppEngine'
timeout: 1800s # 30 minute timeout

如您所见,我使用的是所有 GCP 资源默认具有的 ENV 变量。($PROJECT_ID例如)。在 docker 命令中,我将它作为参数传递,因此我可以ARG在 dockerfile 中使用该命令:

ARG PROJECT
FROM gcr.io/${PROJECT}/swift:4.2 as builder
WORKDIR /App
#Other commands....

现在所有这些工作正常,我可以构建我的图像等。现在我想在最后一步部署到应用程序引擎。唯一的问题是我使用相同的 Dockerfile 来使用swift:4.2仅位于我的 GoogleContainerRegistry 中的基本映像,所以我需要$PROJECT_ID我的项目来提取它。

我的问题是:有没有办法让 AppEngine 构建环境在部署时将参数传递给构建我的映像的 docker build?我有一个app.yaml文件,我知道有一个env_variables:属性,我知道我可以使用 dockerARGENV命令(不记得是哪个)来获取我$PROJECT_ID的 Dockerfile。但唯一的问题是据我所知,AppEngine 没有定义该属性。我能想到的唯一另一件事是echo$PROJECT_IDCloud Builder 步骤到app.yaml文件末尾。但如果有更清洁的方法,我很想听听。谢谢!

4

1 回答 1

5

我想我已经找到了满足我需求的解决方案。

gcloud app deploy有一个标志image-url可以指定已经构建的镜像,而不是重建 Dockerfile。所以我把它作为我的最终cloudbuild.yaml

 - name: 'gcr.io/cloud-builders/gcloud'
   args: ['app', 'deploy', '--image-url', 'gcr.io/$PROJECT_ID/$BRANCH_NAME:$SHORT_SHA']

基本上指向我刚刚构建并推送到我的容器注册表的图像。

于 2018-08-29T11:53:09.983 回答