0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker と Docker Compose の環境変数 - Part 3. 全体の流れ

Last updated at Posted at 2024-06-11

はじめに

◯ 環境変数の受け渡しの流れ

(1) Docker イメージ

3.jpg

(2) Docker コンテナ

4.jpg

◯ ポイント

上の図の矢印は何やねん😠って感じですが

定義する場所 -> 使う場所

という意味で書いています。

  • compose.yaml の中で使える変数
    • 物理環境の環境変数 で定義した変数
    • docker compose build コマンドの引数で定義した変数
    • docker compose up コマンドの引数で定義した変数
  • Dokcerfile の中で使える変数
    • compose.yaml ファイルのプロパティで定義した変数
    • docker image build コマンドの引数で定義した変数
    • docker container run コマンドの引数で定義した変数

◯ 各章の概要

  1. --build-arg オプション ... 自分がハマっていたこと
  2. env_file プロパティ ... ほかの方がハマっていたこと
  3. --env-file オプション ... 2 章を踏まえた練習問題

docker compose config コマンド

BLUE="Squirtle" docker compose --env-file .env.local config

#               docker compose --env-file .env.local build  --build-arg BLUE="Squirtle"
#               docker compose --env-file .env.local up     --env       BLUE="Squirtle"

compose.yaml に環境変数が反映されているかわからない😭 ってことありませんか? docker compose config コマンドを使うと環境変数反映後の compose.yaml で見られます。docker compose config には --build-arg, --env オプションがありません。そのため上記のように先頭に環境変数を書く形 BLUE="Squirtle" で代替する方法があります。

◯ シリーズ

Part 3 ですが Part 1, 2 は読まなくても大丈夫だと思います。

1. --build-arg オプション

◯ ポイント

物理環境の環境変数を直接参照
Dockerfile できない
compose.yaml できる

1.1. Docker

Dockerfile 内では現在の物理環境にある環境変数を直接参照 できない

Docker コマンド(4).jpg

サンプルコード

gh repo clone domodomodomo/docker-env-sample
cd docker-env-sample/part3/111

# for Bash - macOS, Ubuntu
bash cmd.sh

# for PowerShell - Windows
powershell ./cmd.ps1

1.1.1. 問題

サンプルコードの実行結果は次の 1 ~ 4 のうちどれですか?

1.
    BLUE: 'Squirtle'
    RED: 'Charmander'
    GREEN: 'Bulbasaur'

2.
    BLUE: ''
    RED: 'Charmander'
    GREEN: 'Bulbasaur'

3.
    BLUE: 'Squirtle'
    RED: ''
    GREEN: 'Bulbasaur'

4.
    BLUE: 'Squirtle'
    RED: 'Charmander'
    GREEN: ''
答え

4

docker image build コマンドを実行するときに --build-arg オプションを使わないと、現在の物理環境のシェルセッションにある環境変数を Dokcerfile 内で参照 できない

1.2. Docker Compose

compose.yaml 内では物理環境にある環境変数を直接参照 できる

6.jpg

サンプルコード

gh repo clone domodomodomo/docker-env-sample
cd docker-env-sample/part3/121

# for Bash - macOS, Ubuntu
bash cmd.sh

# for PowerShell - Windows
powershell ./cmd.ps1

1.2.1. 問題

サンプルコードの実行結果は次の 1 ~ 4 のうちどれですか?

1.
    BLUE: 'Squirtle'
    RED: 'Charmander'
    GREEN: 'Bulbasaur'

2.
    BLUE: ''
    RED: 'Charmander'
    GREEN: 'Bulbasaur'

3.
    BLUE: 'Squirtle'
    RED: ''
    GREEN: 'Bulbasaur'

4.
    BLUE: 'Squirtle'
    RED: 'Charmander'
    GREEN: ''
答え

1

docker compose build コマンドを実行するときに --build-arg オプションを使わなくても、現在の物理環境のシェルセッションにある環境変数を compose.yaml 内で参照 できる

以後、各設問のサンプルコードの実行方法は省略します。各問題の章立てはディレクトリ名と対応しています。「2.2.1. 問題」ならディレクトリ「221」を参照してください。

2. env_file プロパティ

◯ ポイント

compose.yaml の中で定義した環境変数
Dockerfile の中で 使える
compose.yaml の中で 使えない

7.jpg


例えば以下のプロパティで設定した環境変数は Dockerfile の中で使えるようになりますが compose.yaml の中では使えません。

  1. services.サービス.build.args
  2. services.サービス.env_file
  3. services.サービス.enviroment

これらのプロパティで設定した値を compose.yaml の中で使おうとしてハマった方を 4 件見かけました。

個人的な感想

compose.yaml ファイルの各プロパティは docker image build, docker container run の各オプションと対応していると思っています。なので「docker image build, docker container run を押下したら compose.yaml で環境変数が使えるようになる... あれちょっと考え方がおかしいぞ」っていうのがひとつ気づくポイントなのかなと思いました。


2.1. Docker

意図的に空白にしています

2.2. Docker Compose

2.2.1. 問題

サンプルコードの実行結果は次の 1 ~ 4 のうちどれですか?

1.
    undefined  | undefined

2.
    undefined  | Squirtle

3.
    Squirtle  | undefined

4.
    Squirtle  | Squirtle
  • compose.yamlservices.サービス.env_file プロパティに .env.local を指定したとき
    • .env.local で定義された環境変数が Dockerfile | compose.yaml の中で使える
答え
  • 3
  • Dockerfile

3. --env-file オプション

◯ ポイント

イメージ コンテナ .env を自動で
docker image build docker container run 読み込まない
docker compose build docker compose up 読み込む*1

*1 ただし --env-file が指定された場合は読み込まない

3.1. Docker

--env-file を省略しても .env は読み込まれません。

3.1.1. 問題

サンプルコードの実行結果は次の 1 ~ 2 のうちどれですか?

1.
    BLUE: 'Squirtle'

2.
    BLUE: ''
  • docker container run app を押下したとき
    • .env で定義された環境変数が Dockerfile の中で 使える | 使えない
答え
  • 2
  • 使えない

3.1.2. 問題

サンプルコードの実行結果は次の 1 ~ 2 のうちどれですか?

1.
    BLUE: 'Squirtle'

2.
    BLUE: ''
  • docker container run --env-file .env.local app を押下したとき
    • .env.local で定義された環境変数が Dockerfile | compose.yaml の中で使える
答え
  • 1
  • compose.yaml

3.2. Docker Compose

--env-file を省略すると .env が読み込まれます。compose.yaml の中で使えるようになりますが Dockerfile の中では使えません。

3.2.1. 問題

サンプルコードの実行結果は次の 1 ~ 4 のうちどれですか?

1.
    undefined  | undefined

2.
    undefined  | Squirtle

3.
    Squirtle  | undefined

4.
    Squirtle  | Squirtle
  • docker compose up または build を押下したとき
    • .env で定義された環境変数が Dockerfile | compose.yaml の中で使える
答え
  • 3
  • compose.yaml

3.2.2. 問題

サンプルコードの実行結果は次の 1 ~ 4 のうちどれですか?

1.
    undefined-Charmander  | undefined-undefined

2.
    undefined-Charmander  | Squirtle-Charmander

3.
    Squirtle-Charmander  | undefined-undefined

4.
    Squirtle-Charmander  | Squirtle-Charmander
  • docker compose --env-file .env.local up, build を押下したとき
    • .env で定義された環境変数が compose.yaml の中で 使える | 使えない
    • .env.local で定義された環境変数が Dockerfile | compose.yaml の中で使える
答え
  • 1
  • 使えない
  • compose.yaml

おわりに

ありがとうございました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?