Google 来自 Google Cloud Build Dockerfile 的 AppEngine ENV 变量

Google AppEngine ENV variables from Google Cloud Build Dockerfile

所以我有一个 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 命令中,我将其作为参数传递,因此我可以在 docker 文件中使用 ARG 命令:

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

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

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

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

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']

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