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

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

公開:
💡 工場の製造ラインで「完成品だけ出荷」する賢い梱包術
📌 このページのポイント
マルチステージビルドの流れ 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の中の独立したビルド段階のこと。複数段階でビルドを分けることだよ。
← 用語集にもどる