【Docker】Docker compose ~ 環境変数 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/08/21/000445

の冒頭で言ったAirflow の docker-compose.yml の中の
「image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.10.0}」について
調べたら、Compose 内の環境変数を参照方法だと分かった。

これ以外にも色々勉強になったので、
Docker compose の 環境変数についてまとめておく。

Airflow の docker-compose.yml
https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml

  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.10.0}

目次

【0】公式ドキュメント
【1】環境変数の参照
 1)$変数 / ${変数}
 2)${変数:-default} / ${変数-default}
 3)${変数:?err} / ${変数?err}
【2】環境変数の設定
 0)優先順位
 1).env ファイル
 2)--env-file オプション
 3)environment キー
 4)設定オプションenv_file
 5)docker-compose run実行時の環境変数の設定
【3】Tips
 1)docker compose config コマンド
【4】補足:secrets
 1)サンプル

【0】公式ドキュメント

* 以下のサイトを参照
(ほぼ同じ内容なので軽く一読しとくといいかも)

https://matsuand.github.io/docs.docker.jp.onthefly/compose/environment-variables/
https://docs.docker.jp/compose/environment-variables.html
https://docs.docker.jp/v19.03/compose/environment-variables.html

【1】環境変数の参照

* 以下の公式ドキュメントを参照

https://docs.docker.jp/compose/environment-variables.html#id11

1)$変数 / ${変数}

* $変数 と ${変数} をサポート
 => どっちも同じ意味

2)${変数:-default} / ${変数-default}

* デフォルト値を設定できる

${変数:-default}

* 変数 が設定されていない or 環境変数の値が空の場合、
 defaule の値とする

${変数-default}

* 環境変数内で 変数 が設定されていない場合のみ、
 default の値とする

3)${変数:?err} / ${変数?err}

* 以下の構文を使えば、特定の値を 必須(mandatory)にできる

${変数:?err}

* 変数 が設定されていない or 環境変数の値が空の場合、
 err を含むエラーメッセージと共に終了する

${変数?err}

* 環境変数内で 変数 が設定されていない場合に、
 err を含むエラーメッセージと共に終了する

【2】環境変数の設定

* 各環境ごとに切り替える場合は
 「2)--env-file オプション」が便利そう

0)優先順位

https://docs.docker.jp/compose/environment-variables.html#docker-compose-run

より抜粋
~~~~~
複数のファイルで同じ環境変数がある場合、
Compose は使用する値を選ぶため、以下の優先度で使います。

1. Compose ファイル
2. シェル環境変数
3. 環境変数ファイル
4. Dockerfile
5. 変数が定義されていない
~~~~~

1).env ファイル

* .envという 環境ファイル

コマンド例

$ cat .env
TAG=v1.5

$ docker compose config
services:
  web:
    image: webapp:v1.5 # ★注目
    networks:
      default: null
networks:
  default:
    name: work_default

compose.yaml

services:
  web:
    image: "webapp:${TAG}"

2)--env-file オプション

* docker-compose --env-fileオプションで 環境ファイルを指定する

コマンド例

$ cat dev.env
TAG=v1.6

$ docker-compose --env-file ./dev.env config
services:
  web:
    image: webapp:v1.6 # ★注目
    networks:
      default: null
networks:
  default:
    name: work_default

3)environment キー

* compose.yaml 内の environment キーで定義
 => 勝手な理解としては、container 内の環境変数のために使う?

https://docs.docker.jp/v19.03/compose/compose-file.html#environment

web:
  environment:
    - DEBUG=1 # ★注目

4)設定オプションenv_file

* compose.yaml 内の env_fileキーで定義

https://matsuand.github.io/docs.docker.jp.onthefly/compose/environment-variables/#the-env_file-configuration-option

web:
  env_file:
    - web-variables.env

5)docker-compose run実行時の環境変数の設定

* docker-compose -eオプションで 環境変数と値を指定する

https://matsuand.github.io/docs.docker.jp.onthefly/compose/environment-variables/#set-environment-variables-with-docker-compose-run
コマンド例

$ docker-compose run -e DEBUG=1

【3】Tips

1)docker compose config コマンド

* 自分で作成した時の確認時に便利

コマンド例

$ docker compose config

【4】補足:secrets

* ついでに、secretsについても触れておく

参考文献
https://qiita.com/myabu/items/89797cddfa7225ff2b5d
https://zenn.dev/xknzw/articles/0d1dc1abb1a3e2
https://www.konchanxxx.com/entry/2023/08/07/154325

1)サンプル

公式ドキュメントより

https://docs.docker.com/compose/use-secrets/

services:
   db:
     image: mysql:latest
     volumes:
       - db_data:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD_FILE: /run/secrets/db_password
     # ★ここで使用
     secrets:
       - db_root_password
       - db_password
# ★ここで設定
secrets:
   db_password:
     file: db_password.txt
   db_root_password:
     file: db_root_password.txt
volumes:
    db_data:

関連記事

Docker compose ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2022/04/28/000000
Docker compose ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/05/21/222910
Docker compose ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000
Docker compose ~ 拡張フィールド ~
https://dk521123.hatenablog.com/entry/2024/08/21/000445
Apache Airflow ~ 環境構築 / Docker 編 ~
https://dk521123.hatenablog.com/entry/2021/10/11/134840
YAML (YAML Ain't Markup Language)
https://dk521123.hatenablog.com/entry/2019/10/13/000000