【Docker】イメージレイヤ数を減らして、イメージサイズを小さくしてみた

スポンサーリンク
プログラミング
スポンサーリンク
スポンサーリンク

【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 コマンドは結合して記載したほうがよさそうですね。

タイトルとURLをコピーしました