Google Cloud Build Dockerfile中的Google AppEngine ENV变量

时间:2018-08-28 19:12:26

标签: docker google-app-engine google-cloud-platform app.yaml google-cloud-build

因此,我有一个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....

现在所有这些都可以正常工作,并且我能够构建自己的映像等。现在,我想在最后一步中将其部署到App Engine。 唯一的问题是,我正在使用同一Dockerfile来使用仅位于我的GoogleContainerRegistry中的swift:4.2基本映像,因此我需要$PROJECT_ID用于我的项目才能将其拉出。

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

1 个答案:

答案 0 :(得分: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']

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

相关问题