JavaScriptを有効にしてください

【Docker Compose】 command や entrypoint に環境変数を展開する際の注意点 ~$ENVではなく$$ENVを使おう~

 ·  ☕ 3 分で読めます

【Docker Compose】 command や entrypoint に環境変数を展開する際の注意点 ~$ENVではなく$$ENVを使おう~

Docker Composeを使ってサービスを定義する際、commandentrypointフィールドで環境変数を利用することはよくあります。しかし、これらのフィールドで環境変数を展開する際に $ENV と記述しても期待通りに動作しないことがあります。その理由と正しい使い方を解説します。


なぜ $$ENV が必要なのか?

Docker ComposeのYAMLファイルで $ を使うと、Docker Compose自体がその値を解釈しようとします。これはComposeファイルで環境変数を参照するための機能ですが、この動作の結果として、サービス内で実行されるコマンドに渡る前に値が失われたり、正しく展開されない場合があります。

$$ を使うことで、Composeファイルの中で $ をエスケープできます。エスケープされた $$ はコンテナ内でシングル $ として解釈され、期待通りに環境変数が展開されます。


実例で理解する

誤った設定例: $ENV_VARIABLEを直接使う

以下のComposeファイルでは、commandで環境変数を展開しようとしています。

1
2
3
4
5
6
services:
  example-service:
    image: alpine
    environment:
      ENV_VARIABLE: "Hello, Docker!"
    command: echo $ENV_VARIABLE

この設定では、Composeが $ENV_VARIABLE を解釈しようとします。しかし、Composeファイルには ENV_VARIABLE の定義がなく、空文字列として扱われます。そのため、実行時には以下のように出力されます。

$

正しい設定例: $$ENV_VARIABLEを使用する

次のように設定を変更することで問題を解決できます。

1
2
3
4
5
6
services:
  example-service:
    image: alpine
    environment:
      ENV_VARIABLE: "Hello, Docker!"
    command: echo $$ENV_VARIABLE

この設定では、$$ENV_VARIABLE がシングル $ENV_VARIABLE としてコンテナ内で解釈され、環境変数が正しく展開されます。実行時には以下のように出力されます。

Hello, Docker!

entrypoint フィールドでも同様

command フィールドと同様に、entrypoint フィールドを利用する場合でも $$ を使う必要があります。

設定例

1
2
3
4
5
6
services:
  example-service:
    image: alpine
    environment:
      ENV_VARIABLE: "Hello, Docker!"
    entrypoint: ["sh", "-c", "echo $$ENV_VARIABLE"]

この設定により、ENV_VARIABLE が正しく展開されます。


注意点

  1. エスケープ忘れに注意
    $ をそのまま使用すると、Composeファイルの処理時に解釈されてしまい、環境変数が期待通りに展開されません。

  2. シェル構文に依存
    commandentrypoint での環境変数の展開にはシェルの構文が必要です。["sh", "-c", "..."] を使う形で設定することをオススメします。

  3. デバッグのすすめ
    動作確認を行う際には、docker-compose config コマンドを活用して、生成された設定を確認するのがよいでしょう。


参考資料

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer