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

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

最終更新:
💡 ビルド段階を分け、必要な成果物を次の段階へ渡す

一つのDockerfileに複数のFROMを書いてビルド段階を分け、必要なファイルを別の段階へコピーする方法。ビルド用の道具などを実行用イメージへ持ち込まずに済む。最終イメージの内容や大きさは、ベースとコピーするもの、実行時の依存物によって変わる。

📌 このページのポイント
必要な成果物を別の段階へ渡す ビルド用段階 実行用段階 道具 + ソース 成果物 app 成果物 app 実行用ベース 必要な依存物 COPY --from 縮小率や安全性は、残す内容による
別のベースから実行用の段階を始め、必要な成果物をコピーする例。実行時のライブラリや資源まで全て不要になるわけではない。
ひよこ ひよこ
Dockerfileを何枚も作るの?
ペンギン先生 ペンギン先生
一つのDockerfileに複数のFROMを書くよ。それぞれが新しい段階を始める。ビルド用と実行用などに分け、必要な成果物を次の段階へ渡せるんだ。
ひよこ ひよこ
何を持ち込まずに済むの?
ペンギン先生 ペンギン先生
例えばコンパイラーやビルド専用の道具を使って実行ファイルを作り、別のベースへ実行ファイルだけコピーできる。実行用のベースには、そのファイルが動くために必要なものを用意するよ。
ひよこ ひよこ
前の段階からどう渡すの?
ペンギン先生 ペンギン先生
FROMにAS builderを付けて段階に名前を付け、COPY --from=builder /bin/app /bin/appのように指定する。名前がなくても最初の段階を0として番号で参照できるし、別のイメージからコピーする使い方もあるよ。
ひよこ ひよこ
必ず小さく安全になる?
ペンギン先生 ペンギン先生
不要なものを持ち込まなければ大きさや攻撃対象を減らせるけれど、削減率は内容による。実行用ベースの内容も含まれるし、成果物やコピー先に不要なものがあれば残る。段階を分けただけで脆弱性がなくなるわけではないんだ。
ひよこ ひよこ
scratchに実行ファイルだけ置けばいい?
ペンギン先生 ペンギン先生
scratchは最初のファイルシステム層を作るための特別な出発点で、通常のOS環境は用意されない。プログラムによっては言語の実行環境、動的ライブラリ、CA証明書などが必要だよ。GoやRustという言語名だけで、どの成果物も単独で動くとは決められないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「マルチステージビルド」って出てきたら「ビルド段階を分け、必要な成果物を次の段階へ渡す」と思えばだいたいOK!
📖 おまけ:英語の意味
「Multi-Stage Build」 = 複数段階のビルド
💬 multiは複数、stageは段階。前の段階からファイルを選んで渡す方法で、全段階の内容が自動的に最終イメージへ入るわけではないよ。

参考資料

← 用語集にもどる