Docker Composeでコンテナのビルドが爆速に！？最新のDocker Composeを試してみよう

## はじめに
この前[至高のDockerイメージ生成を求めて -2019年版-](https://qiita.com/inductor/items/25d5accb80ea606d5c51)を書いて多くの反響をいただきました。
~~この記事の中で「BuildKitを使うと軽量なコンテナのビルドが高速にできるようになる」と書いたのですが、実際のところ2019年現在において、Docker Composeの正式リリースではまだこちらの機能が使えません。~~
**Docker for MacのEdgeチャンネルで2.1.5.0(40323)が降ってきて、BuildKitのComposeが使えるようになってました！！！！やったぜ！**

これは、Docker ComposeではDockerのAPIと通信するのにPythonのライブラリである[docker-py](https://github.com/docker/docker-py)を使っていて、こちらのメンテナンスが遅れていることが理由でした。

## Docker ComposeでBuildKitは使えないのか
結論から言うと、次のリリースで使えるようになります。

コンテナビルドの鬼である@orisanoくんが[こちらのPull Request](https://github.com/docker/compose/pull/6584)で対応してくれました。

途中レビュアーがバケーションに入ってしまったり、勝手に機能の有効化方法を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コマンドは[このリンク](https://github.com/docker/compose/releases)からDLできます。1.25.0-rc4以降のバージョンをDLし、renameしてpathを通してchmod +xしておきましょう。

```console
$ 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版(または正式版?)リリースに期待しています。