【Docker】イメージレイヤ数を減らして、イメージサイズを小さくしてみた
前回記事のDockerイメージを小さくしてみました。
RUN
を複数書くと、その数分レイヤが生成されて最終的にサイズが大きくなってしまうそうです。
以下、参考
イメージ、コンテナ、ストレージ・ドライバについて — Docker-docs-ja 17.06 ドキュメント
試してみる
RUN
を複数記載、キャッシュファイル未削除
$ cat Dockerfile
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y php7.4
COPY ./index.php /var/www/html/
CMD [ "php", "-S", "0.0.0.0:80", "-t", "/var/www/html/" ]
$ docker history 66bc6eb1757f
IMAGE CREATED CREATED BY SIZE COMMENT
66bc6eb1757f 9 days ago CMD ["php" "-S" "0.0.0.0:80" "-t" "/var/www/… 0B buildkit.dockerfile.v0
<missing> 9 days ago COPY ./index.php /var/www/html/ # buildkit 13B buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get install -y php7.4 # b… 75.1MB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get update # buildkit 858kB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c LC_ALL=C.UTF-8 add-apt-reposi… 6.02kB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get install -y software-p… 111MB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get update # buildkit 30.7MB buildkit.dockerfile.v0
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 2 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 2 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:925571658dd8453e5… 132MB
RUN
レイヤの合計サイズは226MBくらい
RUN
を1つにまとめる、キャッシュファイル未削除
$ cat Dockerfile
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y software-properties-common \
&& LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php \
&& apt-get update \
&& apt-get install -y php7.4
COPY ./index.php /var/www/html/
CMD [ "php", "-S", "0.0.0.0:80", "-t", "/var/www/html/" ]
$ docker history d96eebb291e9
IMAGE CREATED CREATED BY SIZE COMMENT
d96eebb291e9 23 seconds ago CMD ["php" "-S" "0.0.0.0:80" "-t" "/var/www/… 0B buildkit.dockerfile.v0
<missing> 23 seconds ago COPY ./index.php /var/www/html/ # buildkit 13B buildkit.dockerfile.v0
<missing> 23 seconds ago RUN /bin/sh -c apt-get update && apt-get… 215MB buildkit.dockerfile.v0
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 2 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 2 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:925571658dd8453e5… 132MB
RUN
レイヤのサイズは215MB。レイヤは1つになったけど、サイズは変わらず。RUN
コマンドの結合は、&&
でつなげることができます。改行する場合は\
を使うことで改行できます。
RUN
を1つにまとめる、キャッシュファイル削除
$ cat Dockerfile
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y software-properties-common \
&& LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php \
&& apt-get update \
&& apt-get install -y php7.4 \
&& rm -rf /var/lib/apt/lists/*
COPY ./index.php /var/www/html/
CMD [ "php", "-S", "0.0.0.0:80", "-t", "/var/www/html/" ]
$ docker history 009b7dc8663e
IMAGE CREATED CREATED BY SIZE COMMENT
009b7dc8663e 37 seconds ago CMD ["php" "-S" "0.0.0.0:80" "-t" "/var/www/… 0B buildkit.dockerfile.v0
<missing> 37 seconds ago COPY ./index.php /var/www/html/ # buildkit 13B buildkit.dockerfile.v0
<missing> 37 seconds ago RUN /bin/sh -c apt-get update && apt-get… 184MB buildkit.dockerfile.v0
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 2 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 2 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:925571658dd8453e5… 132MB
RUN
レイヤのサイズは184MB。サイズが減りました。
では、RUNを複数記載した状態でキャッシュファイルを削除するとどうなるのか?
RUN
を複数記載、キャッシュファイル削除
$ cat Dockerfile
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y php7.4
RUN rm -rf /var/lib/apt/lists/*
COPY ./index.php /var/www/html/
CMD [ "php", "-S", "0.0.0.0:80", "-t", "/var/www/html/" ]
$ docker history 9fd837ad56de
IMAGE CREATED CREATED BY SIZE COMMENT
9fd837ad56de 33 seconds ago CMD ["php" "-S" "0.0.0.0:80" "-t" "/var/www/… 0B buildkit.dockerfile.v0
<missing> 33 seconds ago COPY ./index.php /var/www/html/ # buildkit 13B buildkit.dockerfile.v0
<missing> 33 seconds ago RUN /bin/sh -c rm -rf /var/lib/apt/lists/* #… 0B buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get install -y php7.4 # b… 75.1MB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get update # buildkit 858kB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c LC_ALL=C.UTF-8 add-apt-reposi… 6.02kB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get install -y software-p… 111MB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apt-get update # buildkit 30.7MB buildkit.dockerfile.v0
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 2 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 2 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:925571658dd8453e5… 132MB
RUN
レイヤの合計サイズは226MBくらい。レイヤを分かれているとキャッシュが削除されいないっぽい。
それぞれのイメージファイル比較
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
app 004 9fd837ad56de 21 seconds ago 349MB
app 003 009b7dc8663e 2 minutes ago 316MB
app 002 d96eebb291e9 9 minutes ago 347MB
app 001 66bc6eb1757f 9 days ago 349MB
TAG:001 -> RUN
を複数記載、キャッシュファイル未削除
TAG:002 -> RUN
を1つにまとめる、キャッシュファイル未削除
TAG:003 -> RUN
を1つにまとめる、キャッシュファイル削除
TAG:004 -> RUN
を複数記載、キャッシュファイル削除
まとめ
レイヤを結合することで、キャッシュファイルの削除など不要ファイルの削除を実施するときに、イメージサイズ削減の効果が出るみたいです。RUN
コマンドは結合して記載したほうがよさそうですね。