Dockerfileにおけるキャッシュの削除

Dockerfileを見ていて

Dockerfileでは、以下のように指定することが多い。
うん。割とどのDockerfileでもこうやっている。

RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    lxc=1.0* \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

apt-get updateでパッケージの更新を行って、
apt-get installでパッケージのインストールを行って、

&& apt-get clean \
 && rm -rf /var/lib/apt/lists/*

これが気になる。
なんだ。なんなんだ。

Dockerfile のベストプラクティス

ベストプラクティスにも付け加えられている。

付け加えると、apt キャッシュをクリーンにし、 /var/lib/apt/lits を削除することで、イメージのサイズを減らします。 Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント

なるほど、イメージのサイズを減らすのに役立っているらしい。
まぁ削除してるくらいだからね。

debian本家では以下のように言ってます。

APT の場合、基準になる Packages ファイルは Debian アーカイブミラーから提供されます。ですから、利用できるパッケージのデータベース内を検索する際に、毎回ネットワークを使うのはとても非効率的です。このため、APT は (/var/lib/apt/lists/ に) データベースのコピーを保存し、このコピーを使って検索します。同様に、/var/cache/apt/archives/ にはこれまでにダウンロードしたパッケージのキャッシュを保存しています。これは削除後の再インストール時に同じファイルをダウンロードするのを避けるためです。 https://debian-handbook.info/browse/ja-JP/stable/sect.apt-cache.html

つまり消していたファイルはキャッシュです。
データベースを使用する際に毎回ネット接続しなくて済むように、
パッケージデータベースのリストとインストール済みのパッケージをローカルに保存してあるんですね。

apt-get clean では /var/cache/apt/archives にキャッシュされている全てのパッケージを削除
rm -rf /var/lib/apt/lists/* では /var/cache/apt/list にキャッシュされている全てのパッケージリストを削除

します。

自分の環境では。

試しに自分のWSL環境でのキャッシュのサイズを見てみましょう。

$ du -Sh /var/lib/apt/lists/
114M    /var/lib/apt/lists/
$ du -Sh /var/cache/apt/archives/
2.3G    /var/cache/apt/archives/

うん。結構でかい。

CentOSの場合

CentOSなあなたはパッケージ管理をyumで行っているはずです。

yumの場合、キャッシュはどこにあるのかといいますと。
/var/cache/yum/以下になります。
パッケージのインストール後これを削除するには、
yum installの後に

  && rm -rf /var/cache/yum/* \
  && yum clean all

を繋げてあげれば良いみたいです。

以上、今や割と常識らしかったDockerfileのまめちでした。