DockerにはCacheMountという機能がある。
ものすごく雑に言うとdocker build
が爆速になるし、いちいちRUN
の最後でcacheを消すことをしなくて良くなる神機能だ。
機能の概要は https://kotaroooo0-dev.hatenablog.com/entry/2020/06/19/110150
BuildKitの--mount=type=cacheによるキャッシュ
のところで解説されている。
この記事は、この機能がexperimentalだったときに書かれていたものだが、DockerEngineリリースノートによると
20.10.0
buildkit,dockerfile: Support for RUN --mount options without needing to specify experimental dockerfile #syntax directive. moby/buildkit#1717
とあるので、Version 20.10.0時点でexperimentalではなくなった。
Dockerfileの一行目に書く#syntax
も書かなくて良くなったらしい。
cacheディレクトリの内容はイメージレイヤーに残らないが、空ディレクトリ自体は残ってしまう模様。
cacheを削除するのは
docker builder prune --filter type=exec.cachemount
ちなみに
docker system df -v
で確認可能。
Dockerのツール別の動作報告
Docker Desktop for Mac
初期設定のままexperimental: false
でも、何もしなくてもうごいた。
Github actions
この記事を書いている時点のGithubActionsのUbuntu環境では、DOCKER_BUILDKIT=1
を設定する必要があった。
ちなみにBUILDKITのlogは、ciのレポートとしては読みにくいので --progress=plain
をつけると良い
--cache-from
の利用元のイメージを生成するときは、build時にdocker build --build-arg BUILDKIT_INLINE_CACHE=1 .
というようにINLINE_CACHEオプションを有効化しないと、cacheとして扱えない地雷があるので注意
https://github.com/moby/moby/issues/39003
no cache install が不要になった
以前まで
https://qiita.com/hikaruna/items/e049e53b0147e37db977
という記事を書いていたが、今回のCacheMount機能によりこれは不要になった。代わりにCacheMountを用いたレシピを書き溜めたい。
apt
FROM ubuntu
RUN \
--mount=type=cache,target=/var/cache/apt \
--mount=type=cache,sharing=locked,target=/var/lib/apt \
apt-get update && apt-get install -y \
*
npm
# Dockerfile
FROM node
WORKDIR /app
COPY package.json yarn.lock ./
RUN \
--mount=type=cache,target=/tmp/npm_cache \
npm_config_cache=/tmp/npm_cache \
npm install
編集リクエスト歓迎
yarn
# Dockerfile
FROM node
WORKDIR /app
COPY package.json yarn.lock ./
RUN \
--mount=type=cache,target=/tmp/yarn_cache \
YARN_CACHE_FOLDER=/tmp/yarn_cache \
yarn install
gem
# Dockerfile
FROM ruby
RUN \
--mount=type=cache,target=/usr/local/bundle/cache \
gem install *
bundler
# Dockerfile
FROM ruby
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN \
--mount=type=cache,target=/usr/local/bundle/cache \
bundle install
yum
TODO
編集リクエスト歓迎