因此,我有一个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 ARG
或ENV
命令(不记得是哪个一个),将我的$PROJECT_ID
放入我的Dockerfile中。但唯一的问题是,据我所知,AppEngine尚未定义该Property。我唯一想到的是从Cloud Builder步骤echo
到$PROJECT_ID
文件末尾的app.yaml
。但是,如果有一种更清洁的方法,我很想听听。谢谢!
答案 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']
基本上指向我刚刚构建并推送到容器注册表的映像。