地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

RUN --mount=type=cache,target

パッケージマネージャのキャッシュを効かせる

例えばこんな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」です。

github.com

これを使うことで自前のソースなりバイナリのキャッシュはリビルドしつつパッケージマネージャの持つキャッシュは再利用するといったことが可能になります。 とても便利。

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買い目でキャッシュヒットによるビルドの高速化の効果がみられました。




まとめ