パッケージマネージャのキャッシュを効かせる
例えばこんなDockerfileがあるとします
FROM ubuntu RUN apt update && apt install -y gcc RUN echo "AAA" > /root/fileA
これをbuildkitを有効にした状態でビルド すると手元の環境で約80秒程度でビルドが完了しました。
$ docker image build -t nom01 --no-cache . >>> elapsed time 1m21s
で、ここでもう一度同じコマンドイメージでビルドしてみます。 すると同じく80秒程度ビルドに時間がかかりました。
$ docker image build -t nom02 --no-cache . >>> elapsed time 1m22s
一番時間がかかるのはおわかりの通りgccのインストールです。 gccのインストールにはたくさんの依存パッケージが存在するのでとても時間がかかります。
aptはとても賢いです。いい感じに独自のキャッシュを持っていてそこを有効活用することで高速にビルドが可能です。 そんな時に役立つのが18.09から試験的に取り入れられてる「 --mount=type=cache,target」です。
これを使うことで自前のソースなりバイナリのキャッシュはリビルドしつつパッケージマネージャの持つキャッシュは再利用するといったことが可能になります。 とても便利。
Dockerfile例です。 上でもいった通りプレビュー版(?)なのでDockerfileの最上部にシェバングのような記述で機能を使用すること宣言する必要があります。 例ではaptを使用していますがyumやらpipやらnpmでも独自のキャッシュを使っているのでパッケージマネージャに合わせてキャッシュするディレクトリを指定します。
# syntax = docker/dockerfile:experimental FROM ubuntu RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \ apt update && apt install -y gcc RUN echo "AAA" > /root/fileA
で、ビルドします。 1回目はキャッシュの構築 2買い目でキャッシュヒットによるビルドの高速化の効果がみられました。