概要
docker-compose 上で環境変数を扱う方法を紹介します
優先度などもあるのでその辺りの考慮が必要です
環境
- macOS 10.14.5
- docker for mac 18.09.2
docker
以下のコマンドを docker-compose 上で実現します
docker run --rm -e HOGE=hoge busybox /bin/sh -c "echo \$HOGE"
コンテナに渡した環境変数 HOGE を echo しているだけです
ちなみに \$
という感じでエスケープしないと現在のシェル上の HOGE 環境変数を参照してしまうので注意が必要です
environment を使う
まずは単純に environment
を使ってみましょう
直接 YAML ファイルに記載する必要があります
vim docker-compose.yml
version: '3.7'
services:
echo:
image: busybox
environment:
- HOGE=hoge
command:
- "/bin/sh"
- "-c"
- "echo $$HOGE"
docker-compose up -d
docker-compose logs echo
=> hoge
environment
は「コンテナに指定した環境変数を渡す」役割を担っています
このあと紹介する .env や shell 上の環境変数を使う方法とは少しレイヤーが違います
また docker-compose で $
をエスケープするのは $$
にすれば OK です
.env ファイルを使う
.env
ファイルを作成すると「そのファイル内で定義した環境変数を docker-compose.yml ファイル内で参照」することができます
つまり .env
ファイルを記載しただけではコンテナに環境変数を渡すことはできません
あくまでもコンテナ環境変数を渡すのは environment
になります
vim .env
HOGE=hoge_in_env
vim docker-compose.yml
version: '3.7'
services:
echo:
image: busybox
environment:
- HOGE=$HOGE
command:
- "/bin/sh"
- "-c"
- "echo $$HOGE"
docker-compose up -d
docker-compose logs echo
=> hoge_in_env
という感じで .env
ファイルに記載した値をコンテナに渡すことができます
shell 上の環境変数を使う
先程は .env
ファイルに記載することで YAML ファイルに環境変数を渡しました
現在実行しているシェル上に環境変数を設定することで、それを docker-compose.yml 内で参照することもできます
.env
と docker-compose.yml
は先程と同じで以下のように実行してみましょう
HOGE=hoge_in_shell docker-compose up -d
docker-compose logs echo
=> hoge_in_shell
という感じで .env
よりも優先して YAML ファイルで参照できていることがわかります
-e オプションはあるのか
例えば environment
で定義していない環境変数をコンテナに渡したい場合にどうするかですが docker コマンド同様に -e
オプションが使えます
ただ up
コマンドではなく run
コマンドを使います
vim docker-compose.yml
version: '3.7'
services:
echo:
image: busybox
environment:
- HOGE=$HOGE
command:
- "/bin/sh"
- "-c"
- "echo $$HOGE $$FUGA"
FUGA 環境変数も参照するように書き換えた上で以下のように echo コンテナを起動しましょう
docker-compose run -e FUGA=fuga echo
=> hoge_in_env fuga
すると environment
で渡していない環境変数がコンテナに渡っていることが確認できます
まとめ
- コンテナに環境変数を渡すのは
environment
orrun -e
を使う docker-compose.yml
に環境変数を渡すのは.env
or 現在のシェルの環境変数を使う
という感じです
機能によって使うレイヤーが少し異なるのでそこの理解ができれば OK かなと思います
0 件のコメント:
コメントを投稿