5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1年の振り返りAdvent Calendar 2024

Day 11

マルチステージビルドを使ってimageサイズを縮小する

Posted at

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

複数のビルドステージを用いて、最終的なイメージを効率的かつ軽量に構築するimageのビルド方法です。
ビルドの途中で生成される不要なファイルやツールを最終イメージに含めることなく、必要なアーティファクトだけを次のステージに引き継ぐことで、軽量化されたimageを作成することができます。

マルチステージビルドの嬉しさ

マルチステージビルドの嬉しさといえば、imageサイズを小さく保てるところです。
imageサイズを小さくしておくことで、転送速度の改善やストレージコストの縮小などをすることができます。
それに加えて、不要なツール・パッケージを排除できるのでセキュリティリスクの低減にもつながります。

imageサイズの縮小例

マルチステージビルドによるimageサイズの縮小例として、以下の簡単なCプログラムとDockerfileを想定します。

main.c
#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

参考

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?