いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

BuiltKitを有効にする方法 (Docker 18.09以降, Docker Build の拡張)

概要

f:id:gsf_zero1:20211029114204p:plain

よく忘れるので、ここにメモメモ。。。

Dockerビルドの拡張であるBuiltKitを有効にするやり方です。

そもそも、Docker Desktop for Windows とかだと、デフォルトで有効ですので、あまり気になっていないかもしれませんが。

BuildKitが有効かどうかを確認

/etc/docker/daemon.json (Windows の場合は C:\ProgramData\docker\config\daemon.json ) に

  "features": {
    "buildkit": true
  },

ってなってたら既定で有効です。

DOCKER_BUILDKIT環境変数をセット

DOCKER_BUILDKIT=1 と設定した状態で docker image build するとBuiltKitが有効になった状態でビルドされます。

以下のようなDockerfileがあるとして

# syntax=docker/dockerfile:1-labs
FROM busybox:latest

WORKDIR /workspace

# ヒアドキュメント機能は docker/dockerfile:1.3-labs から有効
RUN <<EOF
    echo 'hello' >> hello.txt
    echo 'world' >> world.txt
    cat hello.txt world.txt > helloworld.txt
EOF

CMD [ "cat", "helloworld.txt" ]

これをBuildKitなしの環境でビルドするとエラーになります。

$ DOCKER_BUILDKIT=0 docker image build -t no_builtkit -f Dockerfile ${PWD}
Sending build context to Docker daemon  4.096kB
Error response from daemon: dockerfile parse error line 8: unknown instruction: ECHO

今度は環境変数で有効にした状態でビルドすると

$ DOCKER_BUILDKIT=1 docker image build -t use_env -f Dockerfile ${PWD}
[+] Building 4.2s (13/13) FINISHED                                                                                                                                                                   
 => [internal] load build definition from Dockerfile
 => => transferring dockerfile: 38B
 => [internal] load .dockerignore
 => => transferring context: 2B
 => resolve image config for docker.io/docker/dockerfile:1-labs
 => [auth] docker/dockerfile:pull token for registry-1.docker.io
 => CACHED docker-image://docker.io/docker/dockerfile:1-labs@sha256:250ce669e1aeeb5ffb892b18039c3f0801466536cb4210c8eb2638e628859bfd
 => [internal] load build definition from Dockerfile
 => [internal] load .dockerignore
 => [internal] load metadata for docker.io/library/busybox:latest
 => [auth] library/busybox:pull token for registry-1.docker.io
 => [1/3] FROM docker.io/library/busybox:latest@sha256:52817dece4cfe26f581c834d27a8e1bcc82194f914afe6d50afad5a101234ef1
 => CACHED [2/3] WORKDIR /workspace
 => CACHED [3/3] RUN <<EOF (echo 'hello' >> hello.txt...)
 => exporting to image
 => => exporting layers
 => => writing image sha256:5fc640f5f4d61b0d717dd3a7d443589ef63f83bf99036b375d8e21f1cf619661
 => => naming to docker.io/library/use_env

ちゃんとビルドできます。

docker buildx を使う

環境変数を指定しなくても、docker buildx build ... を使えば、BuildKitが有効状態でビルドできます。

$ docker buildx build -t use_buildx -f Dockerfile ${PWD}
[+] Building 8.4s (13/13) FINISHED                                                                                                                                                                   
 => [internal] load build definition from Dockerfile
 => => transferring dockerfile: 341B
 => [internal] load .dockerignore
 => => transferring context: 2B
 => resolve image config for docker.io/docker/dockerfile:1-labs
 => [auth] docker/dockerfile:pull token for registry-1.docker.io
 => CACHED docker-image://docker.io/docker/dockerfile:1-labs@sha256:250ce669e1aeeb5ffb892b18039c3f0801466536cb4210c8eb2638e628859bfd
 => [internal] load .dockerignore
 => [internal] load build definition from Dockerfile
 => [internal] load metadata for docker.io/library/busybox:latest
 => [auth] library/busybox:pull token for registry-1.docker.io
 => [1/3] FROM docker.io/library/busybox:latest@sha256:52817dece4cfe26f581c834d27a8e1bcc82194f914afe6d50afad5a101234ef1
 => => resolve docker.io/library/busybox:latest@sha256:52817dece4cfe26f581c834d27a8e1bcc82194f914afe6d50afad5a101234ef1
 => => sha256:52817dece4cfe26f581c834d27a8e1bcc82194f914afe6d50afad5a101234ef1 2.29kB / 2.29kB
 => => sha256:d5c6e74e3115b55dce759c1b3a52b1d2db60dc6929681de2f76cdc5d6f4d7412 527B / 527B
 => => sha256:d23834f29b3875b6759be00a48013ba523c6a89fcbaeaa63607512118a9c4c19 1.45kB / 1.45kB
 => => sha256:3aab638df1a9e5bd507442990a0fa8f97c2c48870922f44675c22d0b9060cf66 772.79kB / 772.79kB
 => => extracting sha256:3aab638df1a9e5bd507442990a0fa8f97c2c48870922f44675c22d0b9060cf66
 => [2/3] WORKDIR /workspace
 => [3/3] RUN <<EOF (echo 'hello' >> hello.txt...)
 => exporting to image
 => => exporting layers
 => => writing image sha256:c1e6256db06187345ee64013516939b8ecb470fefa84288d29ae070d8411216b
 => => naming to docker.io/library/use_buildx

ちゃんとビルドできます。

参考情報


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com