所以我有一个 CloudBuild 触发器来构建我的 cloudbuild.yaml
文件,这一切都很好。我还使用 gcloud 构建器运行 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 命令中,我将其作为参数传递,以便我可以在 dockerfile 中使用 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 ARG
或ENV
命令(不记得是哪一个)将我的 $PROJECT_ID
放入我的 Dockerfile 中。但据我所知,唯一的问题是 AppEngine 没有定义该属性。我唯一能想到的就是将 Cloud Builder 步骤中的 $PROJECT_ID
回显到 app.yaml
文件的末尾。但如果有更干净的方法,我很想听听。谢谢!
最佳答案
我想我已经找到了满足我需求的解决方案。
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']
基本上指向我刚刚构建并推送到容器注册表的镜像。
关于docker - 来自 Google Cloud Build Dockerfile 的 Google AppEngine ENV 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52064804/