【マルチステージビルド】

マルチステージビルド とは?

💡 工場の製造ラインで「完成品だけ出荷」する賢い梱包術
📌 このページのポイント
マルチステージビルドの流れ Stage 1: builder FROM openjdk:17 AS builder ソースコード JDK(開発ツール) app.jar(ビルド成果物) COPY --from=builder Stage 2: runtime(最終) FROM openjdk:17-jre-slim app.jar(成果物のみ) ソースコード: なし JDK: なし → 軽量・安全 約 600MB 約 120MB(1/5 に削減)
マルチステージビルドでイメージを軽量化するイメージ
ひよこ ひよこ

マルチステージビルドって何? Dockerfileが複数あるってこと?

ペンギン先生 ペンギン先生

ファイルが複数あるんじゃなくて、1つのDockerfileの中に「ステージ」と呼ぶ段階を複数書けるんだよ。

ひよこ ひよこ

ステージを分けると何が嬉しいの?

ペンギン先生 ペンギン先生

例えばJavaアプリをビルドするとき、コンパイルにはJDKが必要だけど、実行にはJREだけあれば十分だよね。マルチステージなら「ビルド用」ステージでコンパイルして、「実行用」ステージにJARファイルだけ持ち込めるんだ。

ひよこ ひよこ

JDKを最終イメージに入れなくていいんだね!どのくらい小さくなるの?

ペンギン先生 ペンギン先生

ケースによるけど、イメージサイズが1/5〜1/10になることもあるよ。ビルドツールやソースコードが含まれないから、攻撃面も減ってセキュリティも向上するんだ。

ひよこ ひよこ

前のステージからファイルを持ってくるにはどうするの?

ペンギン先生 ペンギン先生

COPY --from=builder /app/target/app.jar /app.jar のように、--from=ステージ名 を指定するよ。ステージにはASとして名前をつけておくんだ。

ひよこ ひよこ

ステージに名前をつけるんだね! Goアプリとかでもよく使うの?

ペンギン先生 ペンギン先生

うん、特にGoやRustは静的バイナリが生成されるから、最終ステージをscratchという空のベースにして数MBの超軽量イメージを作れるんだよ。本番環境では定番のテクニックだね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「マルチステージビルド」って出てきたら「Dockerイメージを小さく・安全にするビルド手法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Multi-Stage Build」 = 多段階ビルド
💬 MultiはMultiple(複数の)の略、StageはDockerfileの中の独立したビルド段階のこと。複数段階でビルドを分けることだよ。
← 用語集にもどる