Docker Compose YAMLの環境変数を.envに変換する
docker-compose.ymlで定義された環境変数を抽出し、スタンドアロンの.envファイルに変換します。Docker Composeで使用されるリスト形式とマッピング形式の両方を解説します。
Real-World Configs
詳細な説明
Docker Composeはサービス内の環境変数定義に2つの形式をサポートしており、どちらもスタンドアロンの.envファイルに抽出できます。この変換を理解することは、Docker環境全体の設定管理に不可欠です。
Docker Composeの環境変数(リスト形式):
services:
api:
image: myapp:latest
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/myapp
- REDIS_URL=redis://redis:6379
- JWT_SECRET=super-secret-key
- LOG_LEVEL=info
- CORS_ORIGINS=https://app.example.com,https://admin.example.com
Docker Composeの環境変数(マッピング形式):
services:
api:
image: myapp:latest
environment:
NODE_ENV: production
DATABASE_URL: "postgres://user:pass@db:5432/myapp"
REDIS_URL: "redis://redis:6379"
JWT_SECRET: super-secret-key
LOG_LEVEL: info
CORS_ORIGINS: "https://app.example.com,https://admin.example.com"
抽出された.envファイル:
NODE_ENV=production
DATABASE_URL=postgres://user:pass@db:5432/myapp
REDIS_URL=redis://redis:6379
JWT_SECRET=super-secret-key
LOG_LEVEL=info
CORS_ORIGINS=https://app.example.com,https://admin.example.com
次にdocker-compose.ymlで参照します:
services:
api:
image: myapp:latest
env_file:
- .env
重要な変換の詳細:
- リスト形式(
- KEY=VALUE) は直接変換可能です -- 各エントリは既にENV構文です。-プレフィックスを削除するだけです。 - マッピング形式(
KEY: VALUE) はYAMLのコロン+スペース区切りを等号に変換する必要があります。値に特殊文字が含まれる場合はクォートが必要になる場合があります。 - 混合ソース。 Docker Composeは
environment:、env_file:、シェル環境変数を組み合わせることができます。environment:の値はenv_file:の値を上書きします。
マルチサービスの抽出: docker-compose.ymlに複数のサービスがある場合、別々の.envファイルが望ましい場合があります:
# api.env
NODE_ENV=production
JWT_SECRET=super-secret-key
# db.env
POSTGRES_DB=myapp
POSTGRES_PASSWORD=dbpassword
Docker ComposeにおけるYAML固有の注意点:
- クォートなしの
yes/no値はYAMLによりブールとしてパースされ、文字列としてではありません。常にクォートしてください:FEATURE_FLAG: "yes"。 - ポートのような値(例:
3000:3000)は文字列としてクォートする必要があります。 $を含む値はエスケープ($$)が必要であるか、変数置換として解釈されます。
ユースケース
複雑なマルチサービスのdocker-compose.ymlファイルから環境変数を集約した.envファイルに抽出し、シークレット管理を容易にし、機密値のバージョン管理へのコミットを避ける場合。