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 ファイル