概要
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 -ddocker-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 -ddocker-compose logs echo
=> hoge_in_env
という感じで .env ファイルに記載した値をコンテナに渡すことができます
shell 上の環境変数を使う
先程は .env ファイルに記載することで YAML ファイルに環境変数を渡しました
現在実行しているシェル上に環境変数を設定することで、それを docker-compose.yml 内で参照することもできます
.env と docker-compose.yml は先程と同じで以下のように実行してみましょう
HOGE=hoge_in_shell docker-compose up -ddocker-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 で渡していない環境変数がコンテナに渡っていることが確認できます
まとめ
- コンテナに環境変数を渡すのは
environmentorrun -eを使う docker-compose.ymlに環境変数を渡すのは.envor 現在のシェルの環境変数を使う
という感じです
機能によって使うレイヤーが少し異なるのでそこの理解ができれば OK かなと思います
0 件のコメント:
コメントを投稿