JJC*_*JJC 10 docker google-cloud-platform kubernetes google-cloud-build
基本上,在使用Google Cloud Build时,如何读取在后续步骤中先前构建步骤中写入的值?
具体来说,我想制作一个基于时间戳和$ SHORT_SHA组合的自定义图像标签。如下所示。但是,它不起作用,因为docker抱怨“导出”,即使起作用,它也可能是另一个env:
# Setting tag in a variable:
- name: 'ubuntu'
args: ['export', '_BUILD_TAG=`date', '-u', '+%Y%m%dT%H%M%S_$SHORT_SHA`']
Run Code Online (Sandbox Code Playgroud)
然后,在后续步骤中:
# Using tag from the variable:
- name: gcr.io/cloud-builders/docker
args: ['build', '-t', 'gcr.io/$PROJECT_ID/$_BUILD_TAG', '.']
Run Code Online (Sandbox Code Playgroud)
那么,如何使用一步的输出呢?我可以将的内容写到date文件中,然后读取它,但是我回到不知道如何从读取的文件中设置变量(或者以其他方式插值其结果以构成docker build的参数)。
我从未找到一种在一个构建步骤中设置环境变量的方法,该方法可以在其他步骤中读取,但是我最终通过以以下方式建立康斯坦丁的答案来达到相同的效果:
在早期的步骤中,我生成基于日期的标记并将其写入文件。文件系统(/ workspace)在步骤之间保留,并用作环境变量的存储。然后,在需要引用该值的每个步骤中,我都会将该文件放在适当的位置。诀窍是使用sh或bash作为每个容器中的入口点,以便可以执行从文件读取的子shell。
这是一个例子:
## Set build tag and write to file _TAG
- name: 'ubuntu'
args: ['bash', '-c', 'date -u +%Y%m%dT%H%M_$SHORT_SHA > _TAG']
...
# Using the _TAG during Docker build:
- name: gcr.io/cloud-builders/docker
entrypoint: sh
args: ['-c', 'docker build -t gcr.io/$PROJECT_ID/image_name:$(cat _TAG) .']
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是,如果您是在JSON对象或需要双引号的内容中以这种方式进行bash插值,则需要subshell调用在容器中执行时永远不被单引号引起来, ,这可能需要转义内部双引号来构建JSON对象。这是一个示例,其中我使用_TAG文件值修补kubernetes配置,以部署新构建的映像:
- name: gcr.io/cloud-builders/kubectl
entrypoint: bash
args: ['-c', 'gcloud container clusters get-credentials --zone $$CLOUDSDK_COMPUTE_ZONE $$CLOUDSDK_CONTAINER_CLUSTER ; kubectl patch deployment deployment_name -n mynamespace -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"image_name\",\"image\":\"gcr.io/$PROJECT_ID/image_name:$(cat _TAG)\"}]}}}}}"']
env:
- 'CLOUDSDK_COMPUTE_ZONE=us-central1-b'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-google-proj-cluster-name'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4183 次 |
| 最近记录: |