Docker Composeでドル記号($)使用時の 'invalid interpolation format' エラーを修正する

beginner🐳 Docker2026-05-30| Docker Compose (V1 または V2), Linux, macOS, または Windows

Error Message

Invalid interpolation format for "environment" option in service "web": "${VARIABLE}"
#docker-compose#環境変数#補完#ドル記号#エスケープ

問題の発生それは通常、ルーチンのアップデートから始まります。docker-compose.ymlに新しいデータベースのパスワードやNginxの設定変数を追加し、docker compose upを実行すると、プロセスが突然停止します。コンテナが起動する代わりに、次のような謎めいたエラーメッセージが表示されます。

Invalid interpolation format for "environment" option in service "web": "${VARIABLE}"

Docker Composeは良かれと思って動作しています。$記号を見つけると、ホストマシンや.envファイルからの変数を参照していると判断します。その文字列が変数補完(インターポレーション)の期待される形式と一致しない場合、パーサーは構文エラーをスローし、サービスの開始を拒否します。

なぜこれが起こるのかDocker Composeは、ドル記号($)を変数補完のために予約しています。この機能は、IMAGE_VERSION=${VERSION}のように動的な値を設定する際には非常に便利です。しかし、Redisのパスワード、正規表現パターン、Nginxの変数など、実際のデータにリテラルの$が含まれている場合、大きな悩みとなります。

内部的には、YAMLパーサーは$VARIABLE${VARIABLE}のようなパターンをスキャンします。有効な変数として認識できないテキストが続く$を見つけた場合、あるいは変数がどこにも定義されていない場合、設定漏洩を防ぐためにシステムはエラーを出力します。

解決策:二重ドル記号によるエスケープ修正は簡単ですが、Composeのエスケープルールに慣れていないと見落としがちです。Docker Composeにドル記号を文字として扱うよう指示するには、二重ドル記号$$)を使用する必要があります。

例:複雑なパスワードの修正データベースのパスワードがP@$sW0rd2024であると仮定します。標準的な(そしてエラーになる)設定は次のようになります。

services:
  web:
    image: node:20-alpine
    environment:
      - DB_PASSWORD=P@$sW0rd2024  # これがエラーを引き起こします

これを修正するには、ドル記号を二重にするだけです。

services:
  web:
    image: node:20-alpine
    environment:
      - DB_PASSWORD=P@$$sW0rd2024 # Composeはこれを単一の $ として読み取ります

コンテナが起動すると、アプリケーションはDB_PASSWORDを意図した通りP@$sW0rd2024として認識します。

Nginxとシェルコマンドの処理このエラーは、Composeを介してシェルスニペットやNginxの変数($host$remote_addrなど)を渡す際に非常によく発生します。エスケープしない限り、これらは毎回失敗します。このNginxのログ形式の例を見てみましょう。

# 誤り - 変数補完エラーが発生します
  environment:
    - LOG_FORMAT=$remote_addr - $remote_user [$time_local]
# 正解 - Docker Compose用に適切にエスケープされています
  environment:
    - LOG_FORMAT=$$remote_addr - $$remote_user [$$time_local]

よりクリーンな方法:.envファイルの使用すべてのドル記号をエスケープすると、YAMLファイルが見づらくなり、管理が難しくなることがあります。よりメンテナンス性の高い戦略は、これらのリテラル値を.envファイルに移動することです。Docker Composeは、外部ファイルから読み込まれる変数をYAML内とは異なる方法で処理します。

  • プロジェクトのルートに.envファイルを作成します。- リテラル値をエスケープせずに追加します。.envファイル:
DB_PASSWORD=P@$sW0rd2024

docker-compose.yml:

services:
  web:
    environment:
      - DB_PASSWORD=${DB_PASSWORD}

このワークフローでは、Composeは.envファイルから文字列を取得し、YAMLに注入します。これにより、パーサーがYAMLファイルを直接読み取る際に通常発生する変数補完の問題を回避できます。

検証コンテナが起動したら、結果を再確認することをお勧めします。次の2つのステップで値を検証できます。

1. Configコマンドを使用するdocker compose configを実行して、コンテナを起動せずにエンジンがYAMLをどのように解釈しているかを確認します。environmentセクションを確認してください。$$を使用した場合、出力では単一の$が表示されているはずです。

2. 実行中のコンテナを確認するコンテナがアクティブになったら、次のコマンドを実行して、アプリが実際に認識している環境変数を表示します。

docker exec -it [コンテナ名] env | grep DB_PASSWORD

出力にDB_PASSWORD=P@$sW0rd2024と表示されれば、解決です。

まとめ"invalid interpolation format" エラーは、ほとんどの場合、YAML内のエスケープされていない$が原因です。次の2つのルールを守ってください。docker-compose.yml内ではリテラルのドル記号に$$を使用するか、生の機密情報を.envファイルに移動して、設定をクリーンでエラーのない状態に保ちましょう。

Related Error Notes