Cloudbuild - 使用来自不同步骤的自定义变量构建 docker 映像

Posted

技术标签:

【中文标题】Cloudbuild - 使用来自不同步骤的自定义变量构建 docker 映像【英文标题】:Cloudbuild - build docker image with custom variable from a different step 【发布时间】:2021-08-19 12:40:33 【问题描述】:

我想实现如下构建过程:

根据构建分支决定environment var 的值 通过差异构建步骤保持此值 使用此变量将其作为build-arg 传递给docker build

这是我的一些 cloudbuild 配置:

  - id: 'Get env from branch'
    name: bash
    args:
      - '-c'
      - |-
        environment="dev"
        if [[ "$BRANCH_NAME" == "staging" ]]; then
          environment="stg"
        elif [[ "$BRANCH_NAME" == "master" ]]; then
          environment="prd"
        fi
        echo $environment > /workspace/environment.txt

  - id: 'Build Docker image'
    name: bash
    dir: $_SERVICE_DIR
    args:
      - '-c'
      - |-
        environment=$(cat /workspace/environment.txt)
        echo "===== ENV: $environment"
        docker build --build-arg ENVIRONMENT=$environment -t gcr.io/$_GCR_PROJECT_ID/$_SERVICE_NAME/$COMMIT_SHA .

问题在于第二步。如果我使用bash 步骤图像,那么我没有docker 可执行文件来构建我的自定义图像。

如果我使用gcr.io/cloud-builders/docker 步骤图像,那么我无法执行 bash 脚本。在args 字段中,我只能传递docker 可执行文件的参数。这样我就无法提取我在构建步骤中坚持的environment 的值。

我设法实现这两者的方法是使用我自己的自定义预构建映像,其中包含 bashdocker 可执行文件。我在容器注册表中有该映像,并将其用作构建步骤映像。但这需要我这边的一些定制工作。我想知道是否有更好、更标准化的方式使用来自cloudbuild 的内置工具。

来源:

how to run inline bash scripts how to persist values through build steps

【问题讨论】:

【参考方案1】:

您可以通过添加 entrypoint:参数来更改默认入口点

  - name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args:
      - -c
      - |
        echo $PROJECT_ID
        environment=$(cat /workspace/environment.txt)
        echo "===== ENV: $environment"
        docker build --build-arg ENVIRONMENT=$environment -t gcr.io/$_GCR_PROJECT_ID/$_SERVICE_NAME/$COMMIT_SHA .

【讨论】:

以上是关于Cloudbuild - 使用来自不同步骤的自定义变量构建 docker 映像的主要内容,如果未能解决你的问题,请参考以下文章

如果 CloudBuild 失败,则在 Cloud Build 中使用 2 个 Dockerfile 来重用中间步骤映像

如何将自定义 Cloud Builders 与来自 Google Artifact Repository 的图像一起使用

cloudbuild.yaml 中构建步骤中的 gcloud beta 命令。我应该使用入口点还是参数?

处理来自 PHPUnit (Laravel 5.2) 的自定义异常

拆分不同颜色的自定义 UIView

使用来自多个视图控制器的自定义 UIView