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 のように環境変数経由で秘匿情報を渡せるようになっていた。ということだったので、これを利用しました。
まだ、一時ファイルを生成して秘匿情報を生成しているよ。
という人は、この機会にでもぜひリファクタリングしてみてください。