Help us understand the problem. What is going on with this article?

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

はじめに

この前至高の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版(または正式版?)リリースに期待しています。

inductor
8割くらい正しい情報を噛み砕いて3秒で出すのが得意
https://inductor.me
infra-workshop
インフラ技術を勉強したい人たちのためのオンライン勉強会です
https://wp.infra-workshop.tech/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした