STEP 21:環境変数とシークレット管理

🔐 STEP 21: 環境変数とシークレット管理

セキュアな設定管理とパスワード保護のベストプラクティス

📋 このステップで学ぶこと

  • ENV命令とARG命令の違い
  • docker run時の-eオプション
  • .envファイルの活用方法
  • docker-compose.ymlでの環境変数設定
  • シークレット管理のベストプラクティス
  • パスワードやAPIキーの安全な管理
  • 実践演習:環境ごとの設定切り替え

🔧 0. このステップの前提知識

📚 これまでの学習の復習

このステップでは、以下の知識を使います。忘れた場合は復習してから進めましょう。

  • Dockerfile:FROM、RUN、COPY、CMDの使い方(STEP 11)
  • docker build:イメージのビルド(STEP 11-14)
  • Docker Compose:複数コンテナの管理(STEP 15-16)
  • サービス間通信:サービス名でのアクセス(STEP 17)

0-1. 作業ディレクトリの準備

# 作業ディレクトリを作成して移動 mkdir -p ~/docker-practice/step21 cd ~/docker-practice/step21 # 現在の場所を確認 pwd

0-2. 環境変数の流れ

【環境変数の設定方法と流れ】 ┌─────────────────────────────────────────────────────────────┐ │ 設定方法の種類 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Dockerfile │ │ .envファイル │ │ docker run │ │ │ │ (ENV) │ │ │ │ (-e) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ │ ビルド時 │ ファイル │ 実行時 │ │ │ 埋め込み │ 読み込み │ 上書き │ │ │ │ │ │ │ └───────────────────┴───────────────────┘ │ │ │ │ │ ↓ │ │ ┌─────────────────┐ │ │ │ コンテナ内 │ │ │ │ 環境変数 │ │ │ │ $MY_VAR │ │ │ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ 【優先順位(高い順)】 1. docker run -e で指定 2. –env-file で指定したファイル 3. docker-compose.yml の environment 4. Dockerfile の ENV

0-3. 環境変数設定方法一覧

設定方法 使い方 用途
ENV(Dockerfile) ENV KEY=value デフォルト値、ビルド時設定
ARG(Dockerfile) ARG KEY=value ビルド時のみの変数
-e(docker run) docker run -e KEY=value 実行時の上書き
–env-file docker run --env-file .env 複数の環境変数を一括設定
environment(Compose) environment: KEY=value Compose内で直接指定
env_file(Compose) env_file: .env Composeでファイル読み込み

🎯 1. ENV命令とARG命令

1-1. ENV(環境変数)

ENV命令は、ビルド時と実行時の両方で使える環境変数を設定します。

【ENVの動作】 ┌─────────────────────────────────────────────────────────────┐ │ Dockerfile │ │ ───────────────────────────────────────────────────────── │ │ FROM python:3.9 │ │ ENV APP_ENV=production ← ビルド時に設定 │ │ ENV APP_PORT=5000 │ │ … │ └─────────────────────────────────────────────────────────────┘ │ │ docker build ↓ ┌─────────────────────────────────────────────────────────────┐ │ イメージ │ │ ───────────────────────────────────────────────────────── │ │ 環境変数が埋め込まれている │ │ APP_ENV=production │ │ APP_PORT=5000 │ └─────────────────────────────────────────────────────────────┘ │ │ docker run ↓ ┌─────────────────────────────────────────────────────────────┐ │ コンテナ │ │ ───────────────────────────────────────────────────────── │ │ $ echo $APP_ENV │ │ production ← 実行時も利用可能 │ │ $ echo $APP_PORT │ │ 5000 │ └─────────────────────────────────────────────────────────────┘

1-2. ARG(ビルド引数)

ARG命令は、ビルド時のみ使える引数です。コンテナ実行時には残りません。

【ARGの動作】 ┌─────────────────────────────────────────────────────────────┐ │ docker build –build-arg VERSION=2.0 . │ └─────────────────────────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Dockerfile │ │ ───────────────────────────────────────────────────────── │ │ ARG VERSION=1.0 ← デフォルト値 │ │ RUN echo “Building v${VERSION}” ← ビルド時に使用可能 │ │ … │ └─────────────────────────────────────────────────────────────┘ │ │ docker build ↓ ┌─────────────────────────────────────────────────────────────┐ │ イメージ │ │ ───────────────────────────────────────────────────────── │ │ ARGの値は残らない(セキュリティ) │ └─────────────────────────────────────────────────────────────┘ │ │ docker run ↓ ┌─────────────────────────────────────────────────────────────┐ │ コンテナ │ │ ───────────────────────────────────────────────────────── │ │ $ echo $VERSION │ │ (空) ← 実行時は利用不可 │ └─────────────────────────────────────────────────────────────┘

1-3. ENVとARGの比較

ENVとARGの違い
項目 ENV ARG
使用タイミング ビルド時 + 実行時 ビルド時のみ
コンテナ内 ✅ 利用可能 ❌ 利用不可
docker buildで変更 ❌ 不可 ✅ 可能(–build-arg)
docker runで変更 ✅ 可能(-e) ❌ 不可
docker inspectで確認 ✅ 可能 ❌ 不可
主な用途 アプリ設定、DB接続情報 ベースイメージバージョン

1-4. ARGをENVに変換

ARGの値をコンテナ実行時にも使いたい場合、ENVに変換します。

# ARGをENVに変換する例 cat > Dockerfile << ‘EOF’ FROM python:3.9-slim # ARGでビルド引数を受け取る ARG APP_VERSION=1.0.0 ARG BUILD_DATE # ARGをENVに変換(実行時にも使用可能に) ENV APP_VERSION=${APP_VERSION} ENV BUILD_DATE=${BUILD_DATE} WORKDIR /app # ビルド時にARGを使用 RUN echo “Building version ${APP_VERSION} on ${BUILD_DATE}” COPY . . CMD [“python”, “app.py”] EOF
# ビルド時にARGを指定 docker build \ –build-arg APP_VERSION=2.0.0 \ –build-arg BUILD_DATE=$(date +%Y-%m-%d) \ -t myapp:2.0 .
💡 使い分けのポイント
  • ARG:ベースイメージのバージョン、ビルド時の設定など
  • ENV:アプリケーションの設定、データベース接続情報など
  • 機密情報はARGでもENVでも直接書かない(.envファイルを使用)

🚀 2. docker run時の-eオプション

2-1. 基本的な使い方

# 単一の環境変数を設定 docker run -e DATABASE_URL=postgresql://localhost/mydb myapp # 複数の環境変数を設定 docker run \ -e DATABASE_URL=postgresql://localhost/mydb \ -e API_KEY=secret123 \ -e DEBUG=true \ myapp # ホストの環境変数を渡す(値を省略) export MY_SECRET=mysecret docker run -e MY_SECRET myapp # MY_SECRET=mysecret が渡される # ファイルから環境変数を読み込む docker run –env-file .env myapp

2-2. 環境変数の優先順位

【優先順位(高い → 低い)】 ┌─────────────────────────────────────────────────────────────┐ │ 1. docker run -e で指定した値 ← 最優先 │ │ docker run -e APP_ENV=development myapp │ ├─────────────────────────────────────────────────────────────┤ │ 2. –env-file で指定したファイルの値 │ │ docker run –env-file .env myapp │ ├─────────────────────────────────────────────────────────────┤ │ 3. Dockerfileの ENV で設定した値 ← 最低 │ │ ENV APP_ENV=production │ └─────────────────────────────────────────────────────────────┘ 例: Dockerfile: ENV APP_ENV=production .env: APP_ENV=staging docker run -e APP_ENV=development → コンテナ内の$APP_ENVは「development」

2-3. 実例:環境別の設定

# 開発環境で起動 docker run \ -e APP_ENV=development \ -e DEBUG=true \ -e LOG_LEVEL=DEBUG \ -e DATABASE_URL=postgresql://localhost/devdb \ -p 5000:5000 \ myapp # 本番環境で起動 docker run \ -e APP_ENV=production \ -e DEBUG=false \ -e LOG_LEVEL=INFO \ -e DATABASE_URL=postgresql://prod-db.example.com/proddb \ -d \ myapp

📄 3. .envファイルの活用

3-1. .envファイルとは?

環境変数をファイルにまとめて管理できます。 機密情報を分離し、環境ごとに切り替えやすくなります。

【.envファイルの利点】 ┌─────────────────────────────────────────────────────────────┐ │ 利点 │ ├─────────────────────────────────────────────────────────────┤ │ ✅ 一元管理:すべての環境変数を1ファイルで管理 │ │ ✅ セキュリティ:.gitignoreで機密情報をGitから除外 │ │ ✅ 環境切り替え:.env.dev、.env.prodで簡単に切り替え │ │ ✅ 可読性:設定がまとまっているので見やすい │ │ ✅ 共有しやすい:.env.exampleをテンプレートとして提供 │ └─────────────────────────────────────────────────────────────┘

3-2. .envファイルの作成

# .envファイルを作成 cat > .env << ‘EOF’ # アプリケーション設定 APP_ENV=development APP_PORT=5000 DEBUG=true # データベース設定 POSTGRES_USER=myuser POSTGRES_PASSWORD=mypassword POSTGRES_DB=mydb DATABASE_URL=postgresql://myuser:mypassword@postgres:5432/mydb # Redis設定 REDIS_HOST=redis REDIS_PORT=6379 # API設定 API_KEY=your-api-key-here SECRET_KEY=your-secret-key-here # その他 TIMEZONE=Asia/Tokyo LOG_LEVEL=INFO EOF # 内容を確認 cat .env

3-3. .envファイルの使用

# docker runで使用 docker run –env-file .env myapp # 複数のenvファイルを使用 docker run –env-file .env –env-file .env.local myapp

3-4. 環境別の.envファイル

# ファイル構成 # .env.example ← テンプレート(Gitにコミット) # .env.development ← 開発環境(Gitに含めない) # .env.staging ← ステージング(Gitに含めない) # .env.production ← 本番環境(Gitに含めない) # .env.developmentを作成 cat > .env.development << ‘EOF’ APP_ENV=development DEBUG=true LOG_LEVEL=DEBUG DATABASE_URL=postgresql://devuser:devpass@localhost:5432/devdb API_KEY=dev-api-key-xxx EOF # .env.productionを作成 cat > .env.production << ‘EOF’ APP_ENV=production DEBUG=false LOG_LEVEL=INFO DATABASE_URL=postgresql://produser:prodpass@prod-db:5432/proddb API_KEY=prod-api-key-xxx EOF
# 使い分け docker run –env-file .env.development myapp docker run –env-file .env.production myapp

3-5. .env.exampleの作成

⚠️ 重要:.gitignoreに追加

機密情報を含む.envファイルは必ずGit管理から除外してください。 代わりに、.env.exampleをテンプレートとして提供します。

# .env.example(テンプレート、Gitにコミット) cat > .env.example << ‘EOF’ # =========================================== # アプリケーション設定 # =========================================== APP_ENV=development APP_PORT=5000 DEBUG=true # =========================================== # データベース設定 # 値はダミーです。実際の値に置き換えてください # =========================================== POSTGRES_USER=youruser POSTGRES_PASSWORD=yourpassword POSTGRES_DB=yourdb # =========================================== # API設定 # =========================================== API_KEY=your-api-key-here SECRET_KEY=your-secret-key-here # =========================================== # 使用方法: # 1. このファイルを .env にコピー # cp .env.example .env # 2. 実際の値に置き換える # =========================================== EOF
# .gitignore cat > .gitignore << ‘EOF’ # 環境変数ファイル(機密情報) .env .env.local .env.*.local .env.development .env.staging .env.production # テンプレートは除外しない !.env.example # ログファイル *.log logs/ # データファイル data/ *.db EOF

🐋 4. docker-compose.ymlでの環境変数

4-1. 方法1: environmentで直接指定

# リスト形式 cat > docker-compose-env1.yml << ‘EOF’ version: ‘3.8’ services: webapp: image: myapp environment: – APP_ENV=production – DEBUG=false – DATABASE_URL=postgresql://user:pass@postgres:5432/db EOF # 辞書形式(推奨) cat > docker-compose-env2.yml << ‘EOF’ version: ‘3.8’ services: webapp: image: myapp environment: APP_ENV: production DEBUG: “false” DATABASE_URL: postgresql://user:pass@postgres:5432/db EOF

4-2. 方法2: env_fileで外部ファイル

cat > docker-compose-envfile.yml << ‘EOF’ version: ‘3.8’ services: webapp: image: myapp env_file: – .env postgres: image: postgres:13 env_file: – .env redis: image: redis:alpine env_file: – .env EOF

4-3. 方法3: 変数展開(${}記法)

# ホストの環境変数や.envから値を取得 cat > docker-compose-expand.yml << ‘EOF’ version: ‘3.8’ services: webapp: image: myapp environment: # .envファイルまたはホスト環境変数から値を取得 DATABASE_PASSWORD: ${DB_PASSWORD} API_KEY: ${API_KEY} # デフォルト値を指定(変数が未設定の場合に使用) LOG_LEVEL: ${LOG_LEVEL:-INFO} APP_PORT: ${APP_PORT:-5000} # 必須(未設定ならエラー) SECRET_KEY: ${SECRET_KEY:?SECRET_KEY is required} EOF
変数展開の記法
記法 説明
${VAR} 変数VARの値を展開
${VAR:-default} VARが未設定なら「default」を使用
${VAR:?error} VARが未設定ならエラー「error」を表示

4-4. 環境変数の優先順位(Compose)

【Docker Composeでの優先順位(高い → 低い)】 1. Composeファイルの environment セクション └─ environment: APP_ENV: production 2. シェルの環境変数(docker-compose実行時) └─ APP_ENV=staging docker-compose up 3. env_file で指定したファイル └─ env_file: – .env 4. Dockerfileの ENV └─ ENV APP_ENV=development

🔒 5. シークレット管理のベストプラクティス

5-1. やってはいけないこと

❌ 絶対にやってはいけない例
# ❌ Dockerfileに直接パスワードを書く FROM python:3.9 ENV DATABASE_PASSWORD=mysecretpassword123 # ダメ! # ❌ docker-compose.ymlにAPIキーを直接書く services: webapp: environment: API_KEY: sk-1234567890abcdef # ダメ! # ❌ .envファイルをGitにコミット git add .env # ダメ!
  • パスワードをDockerfileに直接書く → イメージに残る
  • APIキーをdocker-compose.ymlにハードコード → Gitに残る
  • .envファイルをGitにコミット → 履歴に残る

5-2. 正しいシークレット管理

✅ ベストプラクティス
  1. .envファイルを使う(Gitには含めない)
  2. 環境変数で注入(ビルド時に含めない)
  3. .env.exampleを用意(テンプレートとして)
  4. シークレット管理ツールを使う(本番環境)
【シークレット管理のフロー】 開発チーム │ │ 1. .env.example をGitにコミット │ (テンプレート、ダミー値) ↓ ┌─────────────────────────────────────────────────────────────┐ │ Git リポジトリ │ │ ───────────────────────────────────────────────────────── │ │ .env.example ← コミットする │ │ .gitignore ← .env を除外 │ │ docker-compose.yml │ │ Dockerfile │ └─────────────────────────────────────────────────────────────┘ │ │ 2. 開発者が .env.example を .env にコピー │ 実際の値を設定 ↓ ┌─────────────────────────────────────────────────────────────┐ │ ローカル環境 │ │ ───────────────────────────────────────────────────────── │ │ .env ← 実際の機密情報(Gitに含めない) │ │ docker-compose up │ └─────────────────────────────────────────────────────────────┘

5-3. 本番環境向けシークレット管理ツール

シークレット管理ツール比較
ツール 特徴 対象環境
Docker Secrets Docker Swarm標準機能 Docker Swarm
HashiCorp Vault エンタープライズ向け、高機能 マルチクラウド
AWS Secrets Manager AWS統合、自動ローテーション AWS
Google Secret Manager GCP統合、IAM連携 GCP
Azure Key Vault Azure統合、HSM対応 Azure

🛠️ 6. 実践演習:環境ごとの設定切り替え

6-1. プロジェクト構造

# プロジェクトディレクトリを作成 mkdir -p ~/docker-practice/env-management/app cd ~/docker-practice/env-management
📁 完成時のプロジェクト構成
env-management/ ├── docker-compose.yml ├── docker-compose.dev.yml ├── docker-compose.prod.yml ├── .env.example ├── .env.development ├── .env.production ├── .gitignore └── app/ ├── Dockerfile └── app.py

6-2. アプリケーションを作成

# Pythonアプリを作成 cat > app/app.py << ‘EOF’ import os from flask import Flask, jsonify app = Flask(__name__) @app.route(‘/’) def index(): return jsonify({ ‘app_env’: os.getenv(‘APP_ENV’, ‘unknown’), ‘debug’: os.getenv(‘DEBUG’, ‘false’), ‘log_level’: os.getenv(‘LOG_LEVEL’, ‘INFO’), ‘database_host’: os.getenv(‘DATABASE_URL’, ‘not set’).split(‘@’)[-1].split(‘/’)[0] if ‘@’ in os.getenv(‘DATABASE_URL’, ”) else ‘not set’ }) @app.route(‘/health’) def health(): return jsonify({‘status’: ‘healthy’}) if __name__ == ‘__main__’: port = int(os.getenv(‘APP_PORT’, 5000)) debug = os.getenv(‘DEBUG’, ‘false’).lower() == ‘true’ app.run(host=’0.0.0.0′, port=port, debug=debug) EOF # Dockerfileを作成 cat > app/Dockerfile << ‘EOF’ FROM python:3.9-slim WORKDIR /app RUN pip install flask COPY app.py . # デフォルト値(実行時に上書き可能) ENV APP_ENV=production ENV APP_PORT=5000 ENV DEBUG=false EXPOSE 5000 CMD [“python”, “app.py”] EOF

6-3. 環境変数ファイルを作成

# .env.example(テンプレート) cat > .env.example << ‘EOF’ # =========================================== # アプリケーション設定 # =========================================== APP_ENV=development APP_PORT=5000 DEBUG=true LOG_LEVEL=INFO # =========================================== # データベース設定 # =========================================== POSTGRES_USER=youruser POSTGRES_PASSWORD=yourpassword POSTGRES_DB=yourdb DATABASE_URL=postgresql://youruser:yourpassword@postgres:5432/yourdb # =========================================== # Redis設定 # =========================================== REDIS_PASSWORD=yourredispassword EOF # .env.development cat > .env.development << ‘EOF’ APP_ENV=development APP_PORT=5000 DEBUG=true LOG_LEVEL=DEBUG POSTGRES_USER=devuser POSTGRES_PASSWORD=devpass123 POSTGRES_DB=devdb DATABASE_URL=postgresql://devuser:devpass123@postgres:5432/devdb REDIS_PASSWORD=devredis123 EOF # .env.production cat > .env.production << ‘EOF’ APP_ENV=production APP_PORT=5000 DEBUG=false LOG_LEVEL=INFO POSTGRES_USER=produser POSTGRES_PASSWORD=ProdSecurePass!@# POSTGRES_DB=proddb DATABASE_URL=postgresql://produser:ProdSecurePass!@#@postgres:5432/proddb REDIS_PASSWORD=ProdRedisPass!@# EOF

6-4. docker-compose.ymlを作成

# docker-compose.yml(共通設定) cat > docker-compose.yml << ‘EOF’ version: ‘3.8’ services: postgres: image: postgres:13 environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: – postgres_data:/var/lib/postgresql/data healthcheck: test: [“CMD”, “pg_isready”, “-U”, “${POSTGRES_USER}”] interval: 10s timeout: 5s retries: 5 redis: image: redis:alpine command: redis-server –requirepass ${REDIS_PASSWORD} volumes: – redis_data:/data webapp: build: ./app environment: APP_ENV: ${APP_ENV} APP_PORT: ${APP_PORT} DEBUG: ${DEBUG} LOG_LEVEL: ${LOG_LEVEL} DATABASE_URL: ${DATABASE_URL} REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379 depends_on: postgres: condition: service_healthy redis: condition: service_started volumes: postgres_data: redis_data: EOF

6-5. 環境別オーバーライドを作成

# docker-compose.dev.yml(開発用オーバーライド) cat > docker-compose.dev.yml << ‘EOF’ version: ‘3.8’ services: postgres: ports: – “5432:5432” # 開発時はポート公開 webapp: ports: – “5000:5000” volumes: – ./app:/app # ホットリロード用 EOF # docker-compose.prod.yml(本番用オーバーライド) cat > docker-compose.prod.yml << ‘EOF’ version: ‘3.8’ services: webapp: ports: – “80:5000” restart: always deploy: resources: limits: cpus: ‘0.5’ memory: 512M postgres: restart: always deploy: resources: limits: cpus: ‘1’ memory: 1G redis: restart: always EOF

6-6. .gitignoreを作成

# .gitignore cat > .gitignore << ‘EOF’ # 環境変数ファイル .env .env.local .env.*.local .env.development .env.staging .env.production # テンプレートは除外しない !.env.example # ログファイル *.log logs/ # Pythonキャッシュ __pycache__/ *.pyc EOF

6-7. 起動と確認

# 開発環境で起動 cp .env.development .env docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d # 確認 docker-compose ps curl http://localhost:5000/
{ “app_env”: “development”, “debug”: “true”, “log_level”: “DEBUG”, “database_host”: “postgres:5432” }
# 停止 docker-compose -f docker-compose.yml -f docker-compose.dev.yml down # 本番環境で起動 cp .env.production .env docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d # 確認 curl http://localhost/
{ “app_env”: “production”, “debug”: “false”, “log_level”: “INFO”, “database_host”: “postgres:5432” }
# クリーンアップ docker-compose -f docker-compose.yml -f docker-compose.prod.yml down -v

💪 7. 練習問題

練習問題 1 基礎

ENVとARGの違いを説明してください。

【解答】
項目 ENV ARG
使用タイミング ビルド時 + 実行時 ビルド時のみ
コンテナ内 利用可能 利用不可
変更方法 docker run -e docker build –build-arg
練習問題 2 基礎

.envファイルを使用する利点を3つ挙げてください。

【解答例】
  1. 一元管理:すべての環境変数を1つのファイルで管理できる
  2. セキュリティ:.gitignoreに追加することで機密情報を保護
  3. 環境切り替え:.env.dev、.env.prodなどで簡単に環境を切り替え
練習問題 3 基礎

環境変数の優先順位を高い順に並べてください。

【解答】
  1. docker run -e で指定した値
  2. --env-file で指定したファイルの値
  3. Dockerfileの ENV で設定した値
練習問題 4 応用

docker-compose.ymlで環境変数にデフォルト値を設定する方法を書いてください。

【解答】
version: ‘3.8’ services: webapp: image: myapp environment: # ${変数名:-デフォルト値} の形式 LOG_LEVEL: ${LOG_LEVEL:-INFO} APP_PORT: ${APP_PORT:-5000} DEBUG: ${DEBUG:-false}

${VAR:-default} の記法で、変数が未設定の場合にデフォルト値を使用できます。

練習問題 5 応用

パスワードやAPIキーを安全に管理する方法を3つ挙げてください。

【解答例】
  1. .envファイル + .gitignore:機密情報を.envに保存し、Gitにコミットしない
  2. 環境変数で注入:ビルド時ではなく実行時に環境変数として渡す
  3. シークレット管理ツール:AWS Secrets Manager、HashiCorp Vaultなどを使用
練習問題 6 応用

ARGの値をコンテナ実行時にも使えるようにする方法を書いてください。

【解答】

ARGの値をENVに代入することで、実行時にも使用可能になります。

FROM python:3.9 # ARGでビルド引数を受け取る ARG APP_VERSION=1.0.0 # ARGをENVに変換 ENV APP_VERSION=${APP_VERSION} # これで実行時にも$APP_VERSIONが使える
練習問題 7 発展

開発環境と本番環境で異なる設定を使うdocker-compose構成を設計してください。

【解答】

ファイル構成:

project/ ├── docker-compose.yml # 共通設定 ├── docker-compose.dev.yml # 開発用オーバーライド ├── docker-compose.prod.yml # 本番用オーバーライド ├── .env.development ├── .env.production └── .env.example

使用方法:

# 開発環境 cp .env.development .env docker-compose -f docker-compose.yml -f docker-compose.dev.yml up # 本番環境 cp .env.production .env docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
練習問題 8 発展

.gitignoreに書くべき.env関連のパターンを書いてください。

【解答】
# .gitignore # 環境変数ファイル(機密情報を含む) .env .env.local .env.*.local .env.development .env.staging .env.production # テンプレートは除外しない(コミットする) !.env.example
練習問題 9 基礎

環境変数が必須(未設定ならエラー)にするdocker-compose.ymlの記法を書いてください。

【解答】
version: ‘3.8’ services: webapp: image: myapp environment: # ${変数名:?エラーメッセージ} の形式 SECRET_KEY: ${SECRET_KEY:?SECRET_KEY is required} DATABASE_URL: ${DATABASE_URL:?DATABASE_URL must be set}

変数が未設定の場合、エラーメッセージが表示されて起動が中止されます。

練習問題 10 応用

ホストの環境変数をコンテナに渡す2つの方法を書いてください。

【解答】

方法1: -e で変数名のみ指定

# ホストで環境変数を設定 export MY_SECRET=mysecretvalue # 変数名のみ指定(値はホストから取得) docker run -e MY_SECRET myapp

方法2: docker-compose.ymlで参照

version: ‘3.8’ services: webapp: image: myapp environment: # ホストの環境変数を参照 MY_SECRET: ${MY_SECRET}

📝 STEP 21 のまとめ

✅ このステップで学んだこと
  • ENV vs ARG:実行時 vs ビルド時の使い分け
  • -eオプション:docker run時の環境変数設定
  • .envファイル:環境変数の一元管理
  • 環境別設定:dev、staging、prodの切り替え
  • シークレット管理:パスワードとAPIキーの安全な管理
📊 環境変数設定方法 早見表
方法 コマンド/記法 用途
Dockerfile ENV ENV KEY=value デフォルト値
docker run -e -e KEY=value 実行時の上書き
–env-file --env-file .env 複数の環境変数
Compose environment environment: Compose内で指定
Compose env_file env_file: .env ファイル読み込み
🔐 セキュリティのポイント
  • 絶対に機密情報をDockerfileに書かない
  • 必ず.envファイルを.gitignoreに追加
  • .env.exampleをテンプレートとして提供
  • 本番環境ではシークレット管理ツールを検討
🎯 次のステップの予告

次のSTEP 22では、「データパイプラインの統合実践」を学びます。

  • PostgreSQL + Airflow + Sparkの統合環境構築
  • エンドツーエンドのETLパイプライン実装
  • CSVデータの取り込みから集計、保存まで

これまでの学習を統合した実践的な環境を構築しましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 21

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE