マルチステージビルドとは
複数のビルドステージを用いて、最終的なイメージを効率的かつ軽量に構築するimageのビルド方法です。
ビルドの途中で生成される不要なファイルやツールを最終イメージに含めることなく、必要なアーティファクトだけを次のステージに引き継ぐことで、軽量化されたimageを作成することができます。
マルチステージビルドの嬉しさ
マルチステージビルドの嬉しさといえば、imageサイズを小さく保てるところです。
imageサイズを小さくしておくことで、転送速度の改善やストレージコストの縮小などをすることができます。
それに加えて、不要なツール・パッケージを排除できるのでセキュリティリスクの低減にもつながります。
imageサイズの縮小例
マルチステージビルドによるimageサイズの縮小例として、以下の簡単なCプログラムとDockerfileを想定します。
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y gcc
COPY ./main.c .
RUN gcc -o /usr/local/bin/hello_world main.c
CMD [ "/usr/local/bin/hello_world" ]
このDockerfileをビルドすると、imageサイズは340MB
になります。
$ docker build . -t hello_world
$ docker images | grep hello_world
hello_world latest 1c8709e2e153 30 seconds ago 340MB
ベースになるimageとしてubuntu:24.04
を使っていますが、ubuntu:24.04
のimageサイズは101MB
です。
$ docker images | grep ubuntu | grep 24.04
ubuntu 24.04 20377134ad88 4 weeks ago 101MB
コンテナに入りビルドされた実行ファイルのサイズを確認すると、69KB
でした。
$ docker run -it hello_world bash
$ root@3572e1c41714:/# ls -lh ./usr/local/bin/hello_world
-rwxr-xr-x 1 root root 69K Dec 18 22:22 ./usr/local/bin/hello_world
- カスタムimage:
340MB
- ベースimage:
101MB
- 実行ファイル:
69KB
明らかにプログラムの実行に不要な部分がimageに含まれてしまっているということがわかります。
今回のCプログラムをコンテナを使って実行するにあたり、本当に必要なのものOS環境とビルドされた実行ファイルです。
これをマルチステージビルドを用いて改善します。
以下のようにビルド用のステージと実行用のステージを作成し、ビルド用のステージのアーティファクト(今回で言うとコンパイルされた実行ファイル)を実行用のステージに持ち越すようにします。
FROM ubuntu:24.04 AS builder
RUN apt-get update && apt-get install -y gcc
COPY ./main.c .
RUN gcc -o /usr/local/bin/hello_world main.c
FROM ubuntu:24.04 AS final
COPY --from=builder /usr/local/bin/hello_world /usr/local/bin/hello_world
CMD [ "/usr/local/bin/hello_world" ]
$ docker build . -t hello_world_with_multistagebuild
ビルドされたimageを確認すると、先ほどのものより明らかにimageサイズが縮小されていることが確認できます。(340MB
-> 101MB
)
(※ ベースimageのubuntu:24.04
のサイズと同じになっていますが、アーティファクトのサイズが極めて小さいためです。)
tsuzuki-takaaki@TakaakinoMac-mini hakababa % docker images | grep hello_world_with_multistagebuild
hello_world_with_multistagebuild latest f4dcb4d37627 27 seconds ago 101MB
参考