2019年7月8日月曜日

docker-compose で環境変数を渡すいくつかの方法

概要

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 内で参照することもできます

.envdocker-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 or run -e を使う
  • docker-compose.yml に環境変数を渡すのは .env or 現在のシェルの環境変数を使う

という感じです
機能によって使うレイヤーが少し異なるのでそこの理解ができれば OK かなと思います

0 件のコメント:

コメントを投稿