[docker][自分用メモ] Docker 18.09から正式になったBuildKitが思いのほか快適だった

2018-11-22 10:41:18AIX、UNIX、Linux, ContainerAarch64, arm, container, docker, linux, parallel, 並列処理

fancycrave-151127-unsplash.jpg

上記の記事のようにDocker 18.09からBuildKitと呼ばれる、Dockerfileからcontainerを作成するエンジンが正式版になったようです。

今更ながら調べてみると、Experimentalとはいえ、18.06から提供になっていたんですね。知りませんでした。

どうやらこのBuildKit、使用すると、

  • できる限り並列に実行する
  • キャッシュを有効活用する

みたいですね。multi stage buildなDockerfileを使用していると、特に効果は大きいのだとか。

というわけで実験。

環境:

なんかうちの環境では、experimentalを有効にする必要がありました。
/etc/docker/daemon.json

{
  "experimental": true
}

上記の設定を有効にするため、dockerサービスの再起動。

$ docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:52:51 2018
OS/Arch: linux/arm64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:17:01 2018
OS/Arch: linux/arm64
Experimental: true

有効になっていることを確認したら、docker buildしてみます。
実行前には、環境変数:DOCKER_BUILDKIT=1を設定するようにしてください。

~/docker-build$ DOCKER_BUILDKIT=1 docker build --rm -t kometchtech/kresd -f kresd/Dockerfile.alpine kresd/
[+] Building 307.6s (11/11) FINISHED
> [internal] load .dockerignore 0.1s
> > transferring context: 2B 0.0s
> [internal] load build definition from Dockerfile.alpine 0.1s
> > transferring dockerfile: 4.05kB 0.0s
> [internal] load metadata for docker.io/arm64v8/alpine:edge 0.0s
> CACHED [runtime 1/2] FROM docker.io/arm64v8/alpine:edge 0.0s
> CACHED [internal] helper image for file operations 0.0s
> [knot-dns-build 2/2] RUN set -x && echo @test http://dl-cdn.alpinelinux.org/alpine/edge/testing | tee -a /etc/apk/r 232.4s
> [build 1/1] RUN git clone --recursive https://github.com/CZ-NIC/knot-resolver.git /tmp/knot-resolver && cd /tm 66.7s
> CACHED [runtime 2/2] RUN set -x && echo http://dl-cdn.alpinelinux.org/alpine/edge/testing | tee -a /etc/apk/reposi 0.0s
> [stage-3 1/2] COPY --from=build /tmp/root/ / 3.7s
> [stage-3 2/2] RUN ldconfig / || true 3.3s
> exporting to image 0.6s
> > exporting layers 0.6s
> > writing image sha256:355cc3b5c28b7c3ccafbad84fb70ac7742b2855707e4a48cdb372ca386eb053d 0.0s
> > naming to docker.io/kometchtech/kresd 0.0s

見てわかると思いますが、どの部分でCACHEを使用している、とか、multi stage buildになっている部分はここだよ、とか、各layerごとの処理時間なども出力されています。
実行中の出力を見ると、並列実行されているところも確認できるので、以前までシーケンシャルに実行されていた時と比較すると、だいぶ処理時間を減らすことができるかと思います。

今回使用したDockerfileは以下においてあります。

大きめなDockerfileのcontainer buildするときも、だいぶ処理時間を削減できると思うので、これからはBuildKitを活用していきたいです。

2019/06/12:追記

buildkitについては、contributerの須田さんの資料や、前佛さんの資料が役に立ちます。

この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。

興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。

じつはRouterboard User Group JPの中の人でもある。

Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

2018-11-22 10:41:18AIX、UNIX、Linux, ContainerAarch64, arm, container, docker, linux, parallel, 並列処理