Buildkitとは

(2020-02-11)

Buildkitは高速でセキュアなコンテナイメージのビルドツール。 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 .

参考

Introducing BuildKit - Moby Blog

Docker 18.09 新機能 (イメージビルド&セキュリティ) - nttlabs - Medium