Buildkitとは
dockerBuildkitは高速でセキュアなコンテナイメージのビルドツール。
Docker本体にも18.09から統合され、
DOCKER_BUILDKIT=1 docker build
するとBuildkitが使われるようになった。
LLB (low-level builder)
BuildkitはDockerfileなどをLLBという中間言語にコンパイルする。 LLBは依存関係を表すDAG(Directed acyclic graph; 有向非巡回グラフ)で、 protobufで定義されている。 これによって処理を並列に実行したり、Dockerfileを変更してもそれ以降のステージのキャッシュを全て破棄する必要がなくなった。
--mount=type=cache
Dockerfileを変更しても残せるキャッシュ。
# syntax = docker/dockerfile:1.1-experimental
FROM golang
RUN --mount=type=cache,target=/root/.cache/go-build \
go build ...
--mount=type=secret
秘密鍵など一度ADDしてしまったファイルは最終的に消してもレイヤ上に残ってしまうが、--mount=type=secret
でマウントすると残らない。
# syntax = docker/dockerfile:1.1-experimental
FROM alpine:20200122
RUN apk add --no-cache git openssh
RUN --mount=type=secret,id=ssh,dst=/root/.ssh/id_rsa \
ssh-keyscan -H github.com >> /root/.ssh/known_hosts && \
git clone ...
$ DOCKER_BUILDKIT=1 docker build --secret id=ssh,src=./id_rsa .