DockerのImageサイズがどこで肥大化したか調べる方法

docker history <イメージ名> で、イメージがどのようにビルドされてどの段階で肥大化したかを調べることができます。

手元のPerlアプリで調べてみたらこんな感じでした。
$ docker history dqneo/perllwpstarmans3exif
IMAGE               CREATED             CREATED BY                                      SIZE
24ad7cae95e0        7 weeks ago         /bin/sh -c cpanm Class::Accessor::Fast     &&   75.36 kB
a374089b9a87        7 weeks ago         /bin/sh -c cpanm Digest::HMAC_SHA1     && rm    38.26 kB
bb9668879cfe        7 weeks ago         /bin/sh -c cpanm URI::Escape     && rm -rf /r   70 B
d9e0f852db62        7 weeks ago         /bin/sh -c cpanm MIME::Base64     && rm -rf /   61.99 kB
18e7699f4f14        7 weeks ago         /bin/sh -c cpanm Config::Tiny     && rm -rf /   24.82 kB
d0585c3c8a70        7 weeks ago         /bin/sh -c cpanm JSON::XS     && rm -rf /root   291.8 kB
98528ff0b06b        7 weeks ago         /bin/sh -c cpanm Image::ExifTool     && rm -r   13.99 MB
ba92c61189cd        7 weeks ago         /bin/sh -c yum install -y openssl openssl-dev   15.67 MB
a65d10337ea9        7 weeks ago         /bin/sh -c #(nop) MAINTAINER DQNEO              0 B
ec2f7d4b2dbd        7 weeks ago         /bin/sh -c cpanm Starman     && rm -rf /root/   904.9 kB
7979b8bc0215        7 weeks ago         /bin/sh -c cpanm Plack     && rm -rf /root/.c   1.126 MB
8a70ddccac6d        7 weeks ago         /bin/sh -c cpanm HTTP::[email protected]     && rm -r   604.8 kB
dee1341f353a        7 weeks ago         /bin/sh -c #(nop) MAINTAINER DQNEO              0 B
3b4d67b029f9        7 weeks ago         /bin/sh -c cpanm LWP::UserAgent     && rm -rf   921.8 kB
81e34aa11cdf        7 weeks ago         /bin/sh -c cpanm URI HTTP::Date HTTP::Request   713.5 kB
6de75ba6702d        7 weeks ago         /bin/sh -c #(nop) MAINTAINER DQNEO              0 B
7a77c29cea2f        7 weeks ago         /bin/sh -c #(nop) CMD [perl -v]                 0 B
4e0c822ae517        7 weeks ago         /bin/sh -c #(nop) WORKDIR /root                 0 B
4fa97c05dec4        7 weeks ago         /bin/sh -c cpanm Carton     && rm -rf /root/.   1.529 MB
94ea5cc2cb87        7 weeks ago         /bin/sh -c (curl -L http://cpanmin.us | perl    2.262 MB
6ab72950d8e8        7 weeks ago         /bin/sh -c #(nop) ENV PATH=/opt/perl/bin:/usr   0 B
1b546ba48396        7 weeks ago         /bin/sh -c curl -SL https://cpan.metacpan.org   48.65 MB
b0e272cb9d2f        7 weeks ago         /bin/sh -c #(nop) ENV PERL_PREFIX=/opt/perl     0 B
a922dd15ecf2        7 weeks ago         /bin/sh -c #(nop) ENV PERL_ARCHIVE=perl-5.20.   0 B
c31d221ee4b9        7 weeks ago         /bin/sh -c #(nop) ENV PERL_VER=5.20.1           0 B
330c7693bbe8        7 weeks ago         /bin/sh -c #(nop) WORKDIR /usr/src/perl         0 B
9347191a7cc6        7 weeks ago         /bin/sh -c mkdir /usr/src/perl                  0 B
43839d3d2df7        7 weeks ago         /bin/sh -c yum -y install tar bzip2 gcc make;   70.3 MB
f8dc005bb3c6        7 weeks ago         /bin/sh -c yum -y update; yum clean all         147.5 MB
1c3055bdb2d6        7 weeks ago         /bin/sh -c #(nop) MAINTAINER DQNEO              0 B
8efe422e6104        10 weeks ago        /bin/sh -c #(nop) ADD file:3aa368f7652ffed32e   210 MB
5b12ef8fd570        5 months ago        /bin/sh -c #(nop) MAINTAINER The CentOS Proje   0 B
511136ea3c5a        21 months ago                                                       0 B
下が始点で上が終点です。
順番に見ていくと、

下から3行目のADDで210MB増えてます。これは、FROMで指定したベースイメージ(centos:latest)のビルド過程と思われます。

次に下から5行目の yum update で147MB増えてます。これは・・う〜ん悩ましい。

次に、下から12行目の "curl -SL https://cpan.metacpan.org.." で48MB増えてます。
これはPerl本体のインストールです。

とまあこんな感じで、イメージ肥大化した犯人を突き止めて、そこを改善していけば効率よくダイエットできるかと思います。

今回のケースだと yum updateが一番重かったので、yum updateの対象をちゃんと指定して絞り込めばよいかもしれません。
もしくは、ベースイメージをCentOS(210MB)ではなくDebian(85MB)にするのがよさそうです。
カテゴリ: