Dockerイメージサイズについて

dockerでイメージ作成できるようになると、いろんなもの詰め込みたくなっていきます。あれこれミドルウェアを追加していくとどんどんイメージのサイズが膨らんでいきます。

dockerの使い方が何となくわかってくると、サイズが気になってくるのでこのあたりの調べたメモを残しておきます。

なるべくサイズを抑える

公式のDockerfileがお手本になります。

1.必須パッケージ以外はインストールしない

どうも普通にapt-get installすると、推奨パッケージというものがインストールされるようです。これらは--no-install-recommendsでインストールしないようになります。

  1. キャッシュを削除する

apt-get updateを実行して、パッケージ一覧を取得します。インストールが済めば不要になるので削除できます。rm -rf /var/lib/apt/lists/*で削除しています。

ただ削除すると、次またapt-get updateしないとパッケージのインストールができなくなるので、ビルドに時間がかかります。

RUN apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates \
        wget \
    && rm -rf /var/lib/apt/lists/*
  1. なるべくRUNをまとめて減らす。実行コマンドの順番に注意する

dockerはRUN毎にレイヤが作成されてイメージが積まれていくので、「後でまとめて削除」では思った通りにイメージのスリム化ができないので注意。公式のDockerfileを見ると、&&で連結して1回のRUNでなるべく多くのコマンドを実行してます。

どうもレイヤの数に制限がある(128層?)みたいなので、なるべく減らしておいたほうがいい。

  • 1MBのファイルを作成
  • 上記のファイルを削除

を1回のRUNでやれば差し引き0MBになるけど、別々のRUNで実行するとレイヤーが分かれます。イメージの合計サイズは、このレイヤの合計なので1MB増えたままになってしまうみたいです。

Dockerイメージの変遷

docker history {image name}で、指定したイメージのリビジョンヒストリみたいなものが可視化されます。リストは下から上に向かって新しいレイヤーが積まれていく感じになります。

> docker history all:1.2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
0c2a1abc58f4        51 minutes ago      /bin/sh -c #(nop)  ENV PATH=/usr/local/cargo…   0B
6598faed6f18        51 minutes ago      /bin/sh -c #(nop)  USER dev                     0B
162fe3b5bd9c        52 minutes ago      |1 node_major_version=12 /bin/sh -c set -eux…   821MB
839c7b998f7a        53 minutes ago      /bin/sh -c #(nop)  ENV RUSTUP_HOME=/usr/loca…   0B
bbef5c35d5e8        53 minutes ago      |1 node_major_version=12 /bin/sh -c apt inst…   747MB
859f2afd147f        About an hour ago   |1 node_major_version=12 /bin/sh -c pip inst…   330MB
aeadc05c17f9        About an hour ago   |1 node_major_version=12 /bin/sh -c curl -kL…   12.8MB
38dc694112df        About an hour ago   |1 node_major_version=12 /bin/sh -c apt inst…   55MB
b04214b904f2        2 hours ago         |1 node_major_version=12 /bin/sh -c apt-key …   630kB
2e1431488a80        2 hours ago         /bin/sh -c #(nop)  ENV DEBIAN_FRONTEND=nonin…   0B
de2383807bc1        2 hours ago         |1 node_major_version=12 /bin/sh -c apt-get …   83.3MB
17eeb2c9f4c7        2 hours ago         |1 node_major_version=12 /bin/sh -c curl -sL…   13MB
4042584423b6        2 hours ago         /bin/sh -c #(nop)  ARG node_major_version=12    0B
310d29b7daf3        3 days ago          /bin/sh -c #(nop)  CMD ["bash"]                 0B
2cf87851f878        3 days ago          |2 username=dev wkdir=/home/work /bin/sh -c …   0B
d08e919ad30a        3 days ago          /bin/sh -c #(nop) WORKDIR /home/work            0B
b056f9462452        3 days ago          |2 username=dev wkdir=/home/work /bin/sh -c …   398kB
a5c72fc6fa95        3 days ago          /bin/sh -c #(nop)  ARG wkdir=/home/work         0B
a12ade2d8b58        3 days ago          /bin/sh -c #(nop)  ARG username=dev             0B
499727a607de        3 days ago          /bin/sh -c #(nop)  ENV LANG=ja_JP.UTF-8 LANG…   0B
2a79c339b0bb        3 days ago          /bin/sh -c update-locale LANG=ja_JP.UTF-8       52B
c70cc863c552        3 days ago          /bin/sh -c apt-get update -qq   && apt-get i…   337MB
775349758637        7 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           7 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>           7 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B
<missing>           7 weeks ago         /bin/sh -c [ -z "$(apt-get indextargets)" ]     987kB
<missing>           7 weeks ago         /bin/sh -c #(nop) ADD file:a48a5dc1b9dbfc632…   63.2MB