Docker | 2週間で実務レベルに到達するDocker学習:本番用Dockerfile - Day11

Docker Docker
スポンサーリンク

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 で必要な成果物だけを取り出す
タイトルとURLをコピーしました