Cloud Build で Secret Manager で展開した環境変数を Docker の build-arg に渡す

Cloud Build で Secret Manager から接続情報を取得し、Github Packages の nuget feed からパッケージを復元する - dunno logs

先日上記のように Cloud Build で Secret Manager から取り出した値を環境変数として展開し、後続のビルドステップで利用するということをしましたが、 docker build するケースもあったのでついでに。

もはや Secret Manager は関係ない。

今回のファイル

Dockerfile

FROM alpine

ARG GITHUB_USER="test"
ARG GITHUB_TOKEN="token"
RUN echo $GITHUB_USER

alpine にしてますが、環境変数が渡されてるか知りたいだけなので、そこに意図はないです。

cloudbuild.yaml

steps:

- name: gcr.io/cloud-builders/gcloud
  entrypoint: bash
  args: 
  - -c
  - |
    gcloud secrets versions access --secret=github-access-token latest > /workspace/build_vars

- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args:
  - -c
  - |
    source /workspace/build_vars
    docker build --build-arg GITHUB_USER=$$GITHUB_USER --build-arg GITHUB_TOKEN=$$GITHUB_TOKEN .

Secret Mangar からの読み出しは変わってません。

docker build の部分が今回のポイントです。

以下に記述があるのですが、 $ 一つだと、Cloud Build の変数置換機能で期待通り評価されないので、 $$ としています。 Substituting variable values  |  Cloud Build Documentation

これでうまくいきます。

少し思うこと

Cloud Build には Substitution があって、外から値を与えられるのでそこに Secret Manager から値を渡せると嬉しいのだけどなぁと思いつつ、Sustitution の値はビルドログにもガッツリ残るしそこは微妙なのかもと。

KMS で暗号化した値を Substitution に渡して、それを中で復号するというのも検討してみたんですが、結局こちらに落ち着きました。

参考リンク