问题描述
在 GCB 中使用 Kaniko 的 instructions 使用 kaniko 项目构建器的 exec
形式,如下所示:
- id: 'Build (with Kaniko Cache)'
name: 'gcr.io/kaniko-project/executor:latest'
args:
- --destination=$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA
- --cache=true
- --cache-ttl=6h
但我用它来代替 docker 构建,在这种构建中,我规避了 exec
的使用形式,以注入构建参数(来自 Secret Manager 的访问令牌),如 {{3} } 和 here。
- id: 'Build'
name: gcr.io/cloud-builders/docker
entrypoint: 'bash'
args:
- '-c'
- |
docker build --cache-from $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA --build-arg PERSONAL_ACCESS_TOKEN_GITHUB=$(cat decrypted-pat.txt) -t $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA .
我已经尝试定义一个 bash
入口点,但没有找到,所以我被卡住了。甚至可以运行非执行表单吗?
注意:可以访问容器内文件中的机密,而不是通过构建参数,但这意味着将我的开发人员的设置更改为所有人都拥有该机密文件,以便构建他们的开发本地图像,我可以,但真的不想这样做。
解决方法
Kaniko 执行器映像提供 --build-arg
标志以在构建时传递 ARG 值,类似于 Docker。您将找到附加标志的完整列表 here。
鉴于此,您将能够像这样运行您的构建:
steps:
- name: gcr.io/cloud-builders/gcloud
entrypoint: 'bash'
args: [ '-c',"gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-pat.txt" ]
- name: 'gcr.io/kaniko-project/executor:latest'
args:
- --destination=$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA
- --cache=true
- --cache-ttl=6h
- --build-arg=PERSONAL_ACCESS_TOKEN_GITHUB=$(cat decrypted-pat.txt)
,
我在覆盖 docker-compose
中的入口点时遇到了类似的问题,所以也许我想出的解决方案也适用于此。试试这个:
entrypoint: ""
args:
- /bin/sh # sh is more common than bash
- -c
- docker build --cache-from $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA --build-arg PERSONAL_ACCESS_TOKEN_GITHUB=$(cat decrypted-pat.txt) -t $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA .
或者这个:
entrypoint:
- /bin/sh
- -c
args:
- docker build --cache-from $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA --build-arg PERSONAL_ACCESS_TOKEN_GITHUB=$(cat decrypted-pat.txt) -t $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA .
我了解到,对于 exec
和 entrypoint
使用 args
形式总是会给出预期的结果,关于将其中任何一个声明为字符串我不能说。