✍️

マルチステージビルドを試す

2022/09/11に公開

マルチステージビルド

何のためのものなのか含めて、調べたのでメモ

multi-stage builds

  • Docker 17.05以降から使える機能
  • 不要な生成物を無視してイメージサイズを抑えることができる。

メリット

  • イメージのサイズを小さく抑えることができる。
  • また、それを簡潔にDockerfileに書くことができる。

以前であれば、
アプリケーション構築に必要な全てのレイヤー

本番環境向け(スリム化した)レイヤー
を用意する必要があった。

試してみる

以下のコードで試しています。
https://github.com/masaya-shigeta/multi-stage-build-sample

通常のビルド

$ cd build
$ tree
.
├── Dockerfile
├── go.mod
├── go.sum
└── main.go

ビルド

$  docker build . -t single-build

サイズ確認

$ docker image inspect single-build
略
        },
        "Architecture": "arm64",
        "Variant": "v8",
        "Os": "linux",
        "Size": 510023441,
        "VirtualSize": 510023441,
        "GraphDriver": {
略

約510MB

マルチステージビルド

$ cd ../multi-build
$ tree
.
├── Dockerfile
├── go.mod
├── go.sum
└── main.go

ビルド

$  docker build . -t multi-build

サイズ確認

$ docker image inspect multi-build
略
        },
        "Architecture": "arm64",
        "Variant": "v8",
        "Os": "linux",
        "Size": 15052191,
        "VirtualSize": 15052191,
        "GraphDriver": {
略

約15MB

明らかにサイズの違いがわかりました。

ベストプラクティスにも載っているので、積極的に検討すべきですね。
https://matsuand.github.io/docs.docker.jp.onthefly/develop/dev-best-practices/#how-to-keep-your-images-small

Discussion