📋 このステップで学ぶこと
- 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. 正しいシークレット管理
✅ ベストプラクティス
- .envファイルを使う(Gitには含めない)
- 環境変数で注入(ビルド時に含めない)
- .env.exampleを用意(テンプレートとして)
- シークレット管理ツールを使う(本番環境)
【シークレット管理のフロー】
開発チーム
│
│ 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つのファイルで管理できる
- セキュリティ:.gitignoreに追加することで機密情報を保護
- 環境切り替え:.env.dev、.env.prodなどで簡単に環境を切り替え
練習問題 3
基礎
環境変数の優先順位を高い順に並べてください。
【解答】
docker run -e で指定した値
--env-file で指定したファイルの値
- 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つ挙げてください。
【解答例】
- .envファイル + .gitignore:機密情報を.envに保存し、Gitにコミットしない
- 環境変数で注入:ビルド時ではなく実行時に環境変数として渡す
- シークレット管理ツール: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データの取り込みから集計、保存まで
これまでの学習を統合した実践的な環境を構築しましょう!