Day11:本番用Dockerfile(前半)
マルチステージビルドの前半で最も重要なのは「ビルド用の重い環境」と「本番用の軽い環境」を分けるという発想です。これによりイメージが軽量化し、安全性も向上します。
マルチステージビルドとは何か
“1つの Dockerfile の中に複数の世界を作る”技術
マルチステージビルドは Dockerfile の中に複数の FROM を書き、ビルド環境と実行環境を分離する仕組みです。
Docker 公式は「不要なアーティファクトを最終イメージに残さず、軽量化できる」と説明しています。
普通の Dockerfile では、
npm や build-essential などの ビルドに必要なツールが本番イメージに残ってしまう ため、
イメージが重くなり、セキュリティリスクも増えます。
マルチステージビルドでは:
- ステージ1(build):npm install など重い処理を実行
- ステージ2(runtime):成果物だけをコピーし、軽量イメージで実行
という構造にできます。
なぜ軽量・安全になるのか
不要なツールを“持ち込まない”から
マルチステージビルドでは、
ビルドステージのファイルは最終イメージに含まれません。
その結果:
- npm / build ツールが最終イメージに残らない
- キャッシュや中間ファイルも含まれない
- 攻撃対象が減りセキュリティ向上
- イメージサイズが劇的に小さくなる
Node.js アプリのマルチステージビルド例
以下は Node.js アプリを本番向けに最適化する Dockerfile です。
Dockerfile
# --- ビルドステージ ---
FROM node:18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# 必要ならビルド(例:React など)
# RUN npm run build
# --- 実行ステージ ---
FROM node:18-slim
WORKDIR /app
COPY --from=build /app /app
CMD ["node", "app.js"]
Dockerfileこの構造のポイント
- build ステージで npm install を実行
- runtime ステージは node:18-slim のような軽量イメージ
- COPY –from=build により成果物だけをコピー
- ビルドツールが最終イメージに残らない
前半まとめ
- マルチステージビルド=ビルド環境と実行環境の分離
- 不要なツールを含めないため 軽量・安全
- Docker 公式も推奨する本番向けベストプラクティス
- Node.js では
node:18(build)→node:18-slim(runtime) - COPY –from=build で必要な成果物だけを取り出す

