この記事は リンクバルアドベントカレンダー2023 の24日目の記事です。
昨日は @furuyu_kasago さんの記事です!
はじめに
AWS Copilotで、envごとにDockerfileの内容を変えたいことってありますよね?
例えば、フロントエンドの静的ファイルをビルドするDockerfileで、ビルド時に必須な環境変数を、環境ごとに異なる値にしたいときなど。
この場合は、Serviceの manifest.yml
で variables
や secrets
を environments
で環境ごとに設定しても、ビルドされた静的ファイルには variables
や secrets
の値は反映されていません。
なぜなら、これらの値は、起動したECSタスクに設定されるもので、Dockerのビルドはcopilotコマンドを実行したマシン上で行われるからです。
こういったときに、envごとにDockerfileの内容を動的に変える方法を紹介します。
結論
image.build.args
を使いましょう!
公式ドキュメントはこちら。
リンク先はLoad Balanced Web Serviceですが、他のServiceタイプでも使えます。
Dockerのargsとは
言葉のとおり、Dockerfileに渡す引数です。
例として以下のDockerfileで試します。
FROM alpine:latest
# --build-arg オプションの値がHOGEとFOOに代入される
# 右辺は引数が与えられなかったときに使われるデフォルト値
ARG HOGE=hoge_value \
FOO=foo_value
# ARGの値を環境変数に設定
ENV HOGE=${HOGE} \
FOO=${FOO}
CMD echo ${HOGE}, ${FOO}
docker build
の --build-arg
オプションで使えます。
# --build-arg 未指定でビルド
$ docker build -t arg-sample-image .
# 略
$ docker run --rm arg-sample-image
hoge_value, foo_value # 未指定なので Dockerfile のデフォルト値が入っている
# --build-arg を指定してビルド
$ docker build -t arg-sample-image . --build-arg HOGE=input_value --build-arg FOO=input_value2
# 略
$ docker run --rm arg-sample-image
input_value, input_value2 # 指定した値が入っている
公式ドキュメント
docker composeでも使えます。
AWS copilot の image.build.args
の使い方
さきほどのDockerfileの例だとすると、HOGEとFOOは --build-arg
の値で柔軟に変えられます。
manifest.yml
の例
name: frontend
type: Load Balanced Web Service
image:
build:
context: ./frontend
dockerfile: Dockerfile
args:
TARGET_ENV: ${COPILOT_ENVIRONMENT_NAME}
HOGE: default_hoge # prod環境用の値だとする
FOO: default_foo # prod環境用の値だとする
port: 80
healthcheck:
command: ["CMD-SHELL", "curl -f http://localhost:8001/ || exit 1"]
interval: 10s
retries: 2
timeout: 6s
start_period: 10s
# 略
# 環境ごとに固有の値で上書き
environments:
dev:
image:
build:
args:
HOGE: dev_hoge # dev環境用の値を指定する
FOO: dev_foo # dev環境用の値を指定する
stg:
image:
build:
args:
HOGE: stg_hoge # dev環境用の値を指定する
FOO: stg_foo # dev環境用の値を指定する
このファイルだと、copilot svc deploy -n frontend -e dev
などの実行時のdocker buildコマンドは、次のようになります(多分)。
$ docker build --file Dockerfile --build-arg HOGE=dev_hoge --build-arg=dev_hoge ./frontend .
ユースケース
環境ごとに以下を変えたいときなどにどうぞ。
- 参照するディレクトリ
- 例えば、AppacheやNginxのIP制限/許可対象ファイルのディレクトリ
- パッケージマネージャーのコマンドのオプション
- FROMのイメージ
注意点
Dockerのレイヤーキャッシュが効かないことがあるかもしれないと、どこかで見た気がします。
※気がするだけで、ソースは探してません
おわりに
おわり