如何在 Google Cloud Build 中为 Kaniko 使用非 exec 入口点以启用构建 arg 定义

问题描述

在 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 .

我了解到,对于 execentrypoint 使用 args 形式总是会给出预期的结果,关于将其中任何一个声明为字符串我不能说。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...