Dockerfileをマルチステージングビルドにするメリット
Go言語の様な、コードをビルドする言語の場合、
Dockerイメージに含める物はビルド済みファイルと
OSイメージのみで動作するので、
言語自体のイメージは本来不要になります。
そういった不要になるイメージを段階ビルドにする事で、
最終的に最小構成でイメージを生成する事ができる仕組みです。
どの程度効果があるのか?
試しに、通常のDockerfileとマルチステージングのDockerfileで
Echoを使用して、Helloworldを表示するだけのmain.go
をビルドする例で比べてみましょう。
マルチステージングじゃないのDockerfile
$ docker build -t echo_example .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
echo_example latest 2f4adfcadcbe 11 seconds ago 550MB
golang 1.15-alpine3.12 1a87ceb1ace5 2 weeks ago 402MB
マルチステージングなDockerfile
$ docker build -t echo_example .
$ docker images +[master]
REPOSITORY TAG IMAGE ID CREATED SIZE
echo_example latest a90c4ff0103c 38 seconds ago 13.3MB
<none> <none> 59a7fca22298 43 seconds ago 550MB
golang 1.15-alpine3.12 1a87ceb1ace5 2 weeks ago 402MB
alpine 3.12 a24bb4013296 3 months ago 5.57MB
結果
echo_example
というタグ名で各々ビルドしてみたところ、
通常:550MB
マルチステージングビルド:13.3MB
となり、かなりサイズ圧縮ができています。
まとめ
言語仕様にもよりますが、ビルドする言語の場合は積極的にマルチステージングビルドは活用して行った方が良さそうです。
閲覧ありがとうございました!
個人アプリをリリースしました。良ければインストールしてみてください🙏

Scannable - Simply Recognizer
Scannable - Mobile Scanner App. 無料 スキャンアプリ / 書類 スキャン / OCR / 写真 スキャン シンプル操作で画像からテキスト解析! 教科書や手紙、レシートをデジタルデータにして保存できます。 データ化したテキストは編集・共有可能です。 日本語・英語・中国語(簡体字)...