コンテンツにスキップ

AI Session Notes - 2026-02-24

Docker Compose の volumes の役割と使い分け

学んだこと

  • ホスト側パス:コンテナ側パス 形式のマウントは「コピー」ではなく、物理的に同じファイルを参照する(バインドマウント)
  • コンテナ側パスだけの指定(例: /app/node_modules)は 匿名ボリューム(anonymous volume) になり、Docker が裏で管理する
  • 匿名ボリュームはコンテナ再作成時に再利用されないため、永続化が必要なデータには使わない

詳細

開発環境でよくある3種類の volumes パターン

設定 種類 目的
.:/app バインドマウント ソースコードをホストと同期してホットリロードを実現
/app/node_modules 匿名ボリューム バインドマウントの同期対象から node_modules を除外して保護
./data:/app/data バインドマウント アプリが動的に生成するデータをコンテナ削除後も保持

匿名ボリュームの node_modules が消えても問題ないのは、Dockerfile のビルド時に pnpm install で再現できるため。一方、アプリ実行中に動的に作られるデータ(セッション情報など)はビルドで再現できないため、ホスト側にマウントして保護する。

package.json の lock ファイルによる再現性の保証

学んだこと

  • package.json はバージョンの範囲を指定する(例: ^16.1.6 は 16.1.6 以上 17.0.0 未満)
  • lock ファイル(pnpm-lock.yaml 等)は実際にインストールした正確なバージョンを記録する
  • lock ファイルがあれば、いつ pnpm install を実行しても同じバージョンがインストールされる
  • --frozen-lockfile オプションを付けると、lock ファイルと package.json に食い違いがあった場合にエラーにでき、より厳格に再現性を保証できる

Dockerfile マルチステージビルドと --prod=false の意図

学んだこと

  • マルチステージビルドでは、中間ステージで devDependencies を使いつつ、最終ステージにはビルド成果物だけをコピーすることで本番イメージを軽量に保てる
  • --prod=false は devDependencies も含めてインストールするオプション。ビルド時に TypeScript や CSS フレームワーク等が必要なため
  • 最終ステージ(runner)は standalone 出力のみをコピーするため、devDependencies は本番イメージに含まれない

詳細

マルチステージビルドの流れ:

deps(全依存インストール、--prod=false)
  ↓
builder(deps の node_modules を使ってビルド)
  ↓
runner(ビルド成果物だけコピー。node_modules は持ち込まない → 軽量)

「本番用イメージを作る過程では必要だが、最終的な本番イメージには含めない」という分離がマルチステージビルドの利点。

メタ情報

  • ツール: Claude Code
  • 関連技術: Docker, Docker Compose, volumes, マルチステージビルド, pnpm, lock ファイル