はじめに
この前至高のDockerイメージ生成を求めて -2019年版-を書いて多くの反響をいただきました。
この記事の中で「BuildKitを使うと軽量なコンテナのビルドが高速にできるようになる」と書いたのですが、実際のところ2019年現在において、Docker Composeの正式リリースではまだこちらの機能が使えません。
Docker for MacのEdgeチャンネルで2.1.5.0(40323)が降ってきて、BuildKitのComposeが使えるようになってました!!!!やったぜ!
これは、Docker ComposeではDockerのAPIと通信するのにPythonのライブラリであるdocker-pyを使っていて、こちらのメンテナンスが遅れていることが理由でした。
Docker ComposeでBuildKitは使えないのか
結論から言うと、次のリリースで使えるようになります。
コンテナビルドの鬼である@orisanoくんがこちらのPull Requestで対応してくれました。
途中レビュアーがバケーションに入ってしまったり、勝手に機能の有効化方法をCLIオプションから環境変数フラグに変えられたり、PRがクローズされてメンテナに別PRを建てられたり、環境変数の名前を勝手に変えられたり、といろいろ紆余曲折を経て、つい先月末Docker ComposeプロジェクトのUpstreamにマージされました。
使い方
COMPOSE_DOCKER_CLI_BUILD=1
という環境変数をONにすることで使えます。
試しにDocker Composeを使ってイメージのビルドをやってみましょう。
もちろん、COMPOSE_DOCKER_CLI_BUILD=1 docker-compose up --build
などのように使うこともできます!
Docker ComposeコマンドはこのリンクからDLできます。1.25.0-rc4以降のバージョンをDLし、renameしてpathを通してchmod +xしておきましょう。
$ COMPOSE_DOCKER_CLI_BUILD=1 docker-compose build
db uses an image, skipping
WARNING: Native build is an experimental feature and could change at any time
Building app
[+] Building 31.0s (14/14) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 73B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.21kB 0.0s
=> [internal] load metadata for docker.io/library/golang:1.13.0-alpine3.10 1.8s
=> [internal] load build context 0.0s
=> => transferring context: 102.11kB 0.0s
=> [debugger 1/9] FROM docker.io/library/golang:1.13.0-alpine3.10@sha256:84349ee862d8bafff35e0d2bfd539da565b536b4dfce654773fc21a1db2da6d7 10.6s
=> => resolve docker.io/library/golang:1.13.0-alpine3.10@sha256:84349ee862d8bafff35e0d2bfd539da565b536b4dfce654773fc21a1db2da6d7 0.0s
=> => sha256:7f94eaf8af200ac18deb367dab5fb993b8ee609611a0493aa4adc287f8c682f7 301.73kB / 301.73kB 0.7s
=> => sha256:9fe9984849c103d07696bf941dcae6df23b652efdaedf3d804baeede686e8faf 154B / 154B 0.3s
=> => sha256:84349ee862d8bafff35e0d2bfd539da565b536b4dfce654773fc21a1db2da6d7 1.65kB / 1.65kB 0.0s
=> => sha256:c9f7377aae0ca02bfd86f3d598bde66c11646c7f5597e8c9d8ca4bde78e51df1 1.36kB / 1.36kB 0.0s
=> => sha256:33fbbc2ca571e774e0253ff2e42f0206e96736897b9ec438db701b645a260e9a 3.80kB / 3.80kB 0.0s
=> => sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609 2.79MB / 2.79MB 0.5s
=> => sha256:43c4d47973b8a428b549e22359ac3a552c3c83debaa85da4e394a3cc7917e639 126.84MB / 126.84MB 6.1s
=> => extracting sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609 0.2s
=> => sha256:9aaad45c37b562f6dd13a806b44c2e88c4c3d3a536cfd78c00f6336c1d5d6c40 124B / 124B 0.8s
=> => extracting sha256:7f94eaf8af200ac18deb367dab5fb993b8ee609611a0493aa4adc287f8c682f7 0.1s
=> => extracting sha256:9fe9984849c103d07696bf941dcae6df23b652efdaedf3d804baeede686e8faf 0.0s
=> => extracting sha256:43c4d47973b8a428b549e22359ac3a552c3c83debaa85da4e394a3cc7917e639 3.4s
=> => extracting sha256:9aaad45c37b562f6dd13a806b44c2e88c4c3d3a536cfd78c00f6336c1d5d6c40 0.0s
=> [debugger 2/9] RUN apk --no-cache --update add git 2.5s
=> [debugger 3/9] WORKDIR /realize 0.0s
=> [debugger 4/9] RUN go mod init vendor 0.7s
=> [debugger 5/9] RUN go get gopkg.in/urfave/cli.v2@master && go get github.com/oxequa/realize && go get github.com/rakyll/gotest && go get github.com/jwilder/dockerize 11.5s
=> [debugger 6/9] WORKDIR /go/src/github.com/org/repo 0.1s
=> [debugger 7/9] COPY go.mod go.sum ./ 0.2s
=> [debugger 8/9] RUN GO111MODULE=on go mod download 2.7s
=> [debugger 9/9] COPY . . 0.1s
=> exporting to image 0.6s
=> => exporting layers 0.6s
=> => writing image sha256:5db154f284cd96c98e6bce5825082339569fd941f74f9b4b3abef0b5eb417d7d 0.0s
=> => naming to docker.io/library/repo_app
すごーい!できた!
レイヤをPullしてくるところなどが顕著ですが、BuildKitを使ったときの出力になっています。
というわけで、次のバージョンがいつ出るのかは全く分かりませんが、次のRC版(または正式版?)リリースに期待しています。