Dockerのマルチステージビルドを活用し本番用イメージをスリムに保つ方法
Dockerの本番用イメージをスリムに保つには、ビルド時の不要ファイルを除外し、実行に必要な成果物だけを本番イメージに含めることが重要です。
マルチステージビルドを活用すると、開発用ツールや中間生成物を含めずに最小限の構成が実現できます。
マルチステージビルドとは?
マルチステージビルドは複数の FROM ステージを使い、ビルド用と実行用でイメージを分離する手法です。
これにより、開発に必要な依存やツールを最終イメージに持ち込まず、軽量化を図れます。
ビルドステージ
まずはビルド専用ステージでソースのコンパイル環境を構築します。
下記の例ではNode.jsアプリをアルパインベースでビルドしています。
dockerfileFROM node:18-alpine AS builder
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY . .
RUN yarn build
AS builderでステージ名を定義しています。yarn installで開発依存を含めてインストールしています。yarn buildにより成果物を/app/build配下に生成しています。
依存分離
ビルド成果物以外を切り離すことで、本番イメージが不要に膨張しません。
以下の例ではビルド成果物のみをコピーしています。
dockerfileFROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/build ./build
RUN yarn global add serve
CMD ["serve", "-s", "build"]
--from=builderでビルドステージから必要成果物だけを取得しています。- 本番ステージでは開発依存を一切インストールせず、
serveのみを設定しています。
出力最適化
本番イメージには成果物フォルダとランタイムだけを含めます。
不要なシェルやキャッシュを残さない工夫が効果的です。
dockerfileRUN apk add --no-cache tini \
&& rm -rf /var/cache/apk/*
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["serve", "-s", "build"]
--no-cacheでAPKキャッシュを残しません。tiniをPID1として利用し、プロセス管理を安定化します。
環境変数管理
ビルド時に使う ARG と、実行時に永続化する ENV を明確に分けます。
dockerfileARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV
ARGはビルド中のみ有効です。ENVはイメージに保存され、実行時に読み込まれます。
セキュリティ強化と脆弱性スキャン
本番イメージに不要なツールを含めず、攻撃対象領域を最小化します。
CIパイプラインで Trivy や Anchore を使い、自動的に脆弱性を検出すると安心です。
dockerfileFROM node:18-alpine AS builder
RUN apk add --no-cache git make gcc g++ python3
# …ビルド処理…
FROM node:18-alpine AS production
キャッシュの高度活用
依存解決やビルド成果物を分割ステージでキャッシュし、ビルド効率を高めます。
dockerfileFROM node:18-alpine AS deps
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
FROM deps AS builder
COPY . .
RUN yarn build
deps ステージを切り出すことで、package.json に変更がない限りインストールを再実行しません。
公式参照:Docker Build Cache
CI/CD統合と自動化
GitHub Actionsなどで本番ステージのビルドからスキャン、レジストリへのプッシュを自動化します。
yamljobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: |
docker build \
--target production \
--tag myapp:prod .
- name: Scan for vulnerabilities
run: trivy image myapp:prod
- name: Push to registry
run: |
echo ${{ secrets.REGISTRY_PASS }} | docker login ...
docker push myapp:prod
--target productionで本番ステージのみをビルドしています。- スキャンとプッシュまで含めたワークフローが信頼性を高めます。
イメージ署名と信頼性担保
cosign を用いてイメージに署名し、改ざん防止と実行時検証を行います。
bashcosign sign --key cosign.key myregistry.io/myapp:prod
cosign verify --key cosign.pub myregistry.io/myapp:prod
これにより、Kubernetesの ImagePolicyWebhook と連携し、承認済みイメージのみを実行できます。
公式参照:Sigstore Cosign
リリースパイプラインのベストプラクティス
タグ付けとチャネル戦略でステージングと本番を明確に分けます。
bashdocker build --target production -t myapp:1.0.0 .
docker tag myapp:1.0.0 myapp:staging
docker tag myapp:1.0.0 myapp:latest
- バージョン番号で一貫性を担保します。
- ローリングアップデートやブルーグリーンデプロイと相性が良い運用方法です。
まとめ
- ビルドステージ で開発用依存とビルド成果物を切り離す
- 出力最適化 で不要ファイル・キャッシュを除去する
- 環境変数管理 を
ARGとENVで分離する - セキュリティ強化 と脆弱性スキャンの自動化
- キャッシュ活用 によるビルド効率向上
- CI/CD統合 でビルドからデプロイを一貫自動化
- イメージ署名 による改ざん防止
- リリース管理 のタグ戦略
これらを組み合わせることで、スリムかつ安全な本番用Dockerイメージを維持し、高速なデプロイと運用コストの削減が図れます。
公式ドキュメント
articleDocker を用いた統一ローカル環境:新人オンボーディングを 1 日 → 1 時間へ
articleDocker で Dev Container を構築:VS Code/Codespaces で即戦力環境を配布
articleDocker マルチステージビルド設計大全:テスト分離・依存最小化・キャッシュ戦略
articleDocker コマンド早見表:build/run/exec/logs/prune を 1 枚で網羅
articleWindows WSL2 に Docker を最適導入:I/O 最適化・メモリ配分・互換性チェック
articleDocker vs Podman vs nerdctl 徹底比較:CLI 互換性・rootless・企業導入の勘所
articleComfyUI とは?ノードベースで組む最新画像生成ワークフローを完全解説【2025 年版】
articleBun とは?Node.js・Deno と何が違うのかを 3 分で理解【2025 年最新版】
articleShell Script とは?初心者が最短で理解する基本構文・実行モデル・活用領域
articleNode.js 本番メモリ運用:ヒープ/外部メモリ/リーク検知の継続監視
articleReact とは? 2025 年版の特徴・強み・実務活用を一気に理解する完全解説
articleNext.js でインフィニットスクロールを実装:Route Handlers +`use` で滑らかデータ読込
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来