技術(tech)

【circleci】Orb(aws-ecr)でのイメージビルド時に、秘匿情報として環境変数を渡す

Dockerfileのイメージビルド処理の中で、PrivateなGitHubリポジトリをCloneして、
アプリケーションのビルドに使用したい。
だから、GitHubからcloneしてくるためにGitHubのPATをイメージビルド時に渡したい。
というようなケースがあります。

この際に、circleciのOrb(aws-ecr)側から、どうやって秘匿情報を渡せば良いんだ?
と一瞬悩んだので、ここに書き留めます。

前提

 

  • Docker Buildkitによるビルド
  • circleci 2.1
  • aws-ecr: 8.2.1

 

本題

例えば、以下のようなDockerfileがある想定です。
docker buildのパラメータとして秘匿情報(mypat)が渡されることを期待しています。

FROM nginx:latest

RUN --mount=type=secret,id=mypat,uid=0 \
cat /run/secrets/mypat && \
TEST_ENV=$(cat /run/secrets/mypat)

# 後続のBuild処理で、TEST_ENVの環境変数の値を使う

 

結論、aws-ecrのbuild-and-push-imageジョブ/コマンドを以下のように呼び出せばOKです。

- aws-ecr/build-and-push-image:
repo: "${AWS_RESOURCE_NAME_PREFIX}"
tag: "${CIRCLE_SHA1}"
extra-build-args: "--secret id=mypat,env=GITHUB_TOKEN"

 

ポイントは「extra-build-args」の箇所です。

docker build時の追加のパラメータはここで渡してあげます。
参考:https://circleci.com/developer/ja/orbs/orb/circleci/aws-ecr#commands-build-and-push-image

env=の箇所で、circleciを実行しているコンテナの環境変数の値を渡すことができます。
例えば、GITHUB_TOKENをcircleciのcontext等に設定しておいて、秘匿情報(mypat)として渡してあげます。

余談

実は、Docker Engine 20.10.0より前だと、秘匿情報を渡すためには、ファイル経由で渡すしかありませんでした。

この辺は以下の記事がとても参考になりました。
https://developer.feedforce.jp/entry/2021/03/15/102530

例えば、CI側では一時ファイルを作って、docker build時に渡す。
というまわりくどい書き方をする必要がありました。

echo $GITHUB_TOKEN > /home/circleci/project/mypat
docker build -t ${CIRCLE_SHA1}:latest --secret id=mypat,src=/home/circleci/project/mypat .

 

aws-ecrのOrbを使ってbuild/pushする際には上記のやり方には合わせられないなぁ…と思って調べていたら、20.10.0 からは –secret id=my_env,env=MY_ENV のように環境変数経由で秘匿情報を渡せるようになっていた。ということだったので、これを利用しました。

まだ、一時ファイルを生成して秘匿情報を生成しているよ。
という人は、この機会にでもぜひリファクタリングしてみてください。