1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linkbal(リンクバル)Advent Calendar 2023

Day 24

AWS CopilotでenvごとにDockerfileを動的に変える

Last updated at Posted at 2023-12-23

この記事は リンクバルアドベントカレンダー2023 の24日目の記事です。

昨日は @furuyu_kasago さんの記事です!

はじめに

AWS Copilotで、envごとにDockerfileの内容を変えたいことってありますよね?

例えば、フロントエンドの静的ファイルをビルドするDockerfileで、ビルド時に必須な環境変数を、環境ごとに異なる値にしたいときなど。
この場合は、Serviceの manifest.ymlvariablessecretsenvironments で環境ごとに設定しても、ビルドされた静的ファイルには variablessecrets の値は反映されていません。
なぜなら、これらの値は、起動したECSタスクに設定されるもので、Dockerのビルドはcopilotコマンドを実行したマシン上で行われるからです。

こういったときに、envごとにDockerfileの内容を動的に変える方法を紹介します。

結論

image.build.args を使いましょう!

公式ドキュメントはこちら。
リンク先はLoad Balanced Web Serviceですが、他のServiceタイプでも使えます。

Dockerのargsとは

言葉のとおり、Dockerfileに渡す引数です。

例として以下の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 の例

copilot/frontend/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のレイヤーキャッシュが効かないことがあるかもしれないと、どこかで見た気がします。
※気がするだけで、ソースは探してません

おわりに

おわり

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?