dockerでイメージ作成できるようになると、いろんなもの詰め込みたくなっていきます。あれこれミドルウェアを追加していくとどんどんイメージのサイズが膨らんでいきます。
dockerの使い方が何となくわかってくると、サイズが気になってくるのでこのあたりの調べたメモを残しておきます。
なるべくサイズを抑える
公式のDockerfileがお手本になります。
1.必須パッケージ以外はインストールしない
どうも普通にapt-get install
すると、推奨パッケージというものがインストールされるようです。これらは--no-install-recommends
でインストールしないようになります。
- キャッシュを削除する
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/*
- なるべく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