-eフラグで環境変数を設定する
-eフラグを使用してDocker containerに環境変数を渡す方法を学びます。変数の優先順位、設定のための一般的なパターン、シークレットのセキュリティベストプラクティスについて解説します。
Environment & Config
詳細な説明
環境変数によるContainerの設定
環境変数はDocker containerを実行時に設定するための標準的な方法です。-e(または--env)フラグでキーバリューペアをcontainerに渡します:
docker run -d \
-e NODE_ENV=production \
-e PORT=3000 \
-e DATABASE_URL=postgres://user:pass@db:5432/myapp \
my-node-app
container内では、これらの変数は標準的な環境変数メカニズム(Node.jsのprocess.env、Pythonのos.environなど)を通じてアクセスできます。
構文のバリエーション
# 明示的なkey=value
-e MY_VAR=my_value
# ホストの環境変数を渡す(同じ名前)
-e MY_VAR # ホストのMY_VARの値を渡す
# 空の値
-e MY_VAR= # MY_VARを空文字列に設定
# スペースを含む値にはクォートを使用
-e "MY_VAR=hello world"
ホスト変数のパススルー
値を省略すると、Dockerはホスト環境から変数を渡します:
export API_KEY=abc123
docker run -e API_KEY my-app # containerはAPI_KEY=abc123を受け取る
これはコマンド履歴やスクリプトに表示されるべきでないシークレットに便利です。
複数の環境変数
ほとんどの実際のアプリケーションは多くの変数が必要です。それぞれに独自の-eフラグが必要です:
docker run -d \
-e DB_HOST=db.example.com \
-e DB_PORT=5432 \
-e DB_USER=admin \
-e DB_PASS=secret \
-e DB_NAME=myapp \
-e REDIS_URL=redis://cache:6379 \
-e LOG_LEVEL=info \
-e CORS_ORIGIN=https://example.com \
my-api
変数が多い場合は、代わりにenvファイルの使用を検討してください(env-fileの例を参照)。
一般的な環境変数パターン
| パターン | 例 |
|---|---|
| データベース接続 | DATABASE_URL=postgres://... |
| フィーチャーフラグ | ENABLE_CACHE=true |
| ランタイムモード | NODE_ENV=production |
| サービスディスカバリ | API_HOST=api.internal |
| ロギング | LOG_LEVEL=debug |
セキュリティに関する考慮事項
- コマンド履歴:
-eで設定された変数はdocker inspectの出力やshell履歴に表示されます。機密データにはenvファイルやDocker secretsを使用してください。 - Imageレイヤー: Dockerfile内の
ENVでシークレットをDocker imageに組み込まないでください。代わりに実行時に注入してください。 - ロギング: アプリケーションが起動時に機密性の高い環境変数をログ出力しないことを確認してください。
- 最小権限の原則: containerが実際に必要な変数のみを渡してください。
ユースケース
開発、ステージング、本番環境で異なる設定が必要なデータベース資格情報、APIキー、フィーチャーフラグを持つNode.js APIサーバーをデプロイする場合に使用します。