BuildKit を有効にして docker build した場合、どのくらい高速になるのか確認しました。
BuildKit
詳細まで理解していませんが、ざっくりまとめると、
- 依存関係のない命令を並列実行できる
- コンパイラやパッケージマネージャのキャッシュディレクトリを保持できる
これらの仕組みにより、ビルドを高速化しているようです。
利用方法
BuildKit は docker v18.06
から使えます。
環境変数 DOCKER_BUILDKIT=1
を設定するだけで有効になります。
BuildKit 無効のとき
BuildKit を無効化。
$ export DOCKER_BUILDKIT=0
中間レイヤ削除とキャッシュ不使用のオプションを付けてビルド。
$ docker build . --rm --no-cache -t rails_app -f dockerfiles/rails/Dockerfile
ビルド時間は 4m27s
でした。
BuildKit 有効のとき
次は有効にしてビルドしてみます。
$ export DOCKER_BUILDKIT=1
$ docker build . --rm --no-cache -t rails_app -f dockerfiles/rails/Dockerfile
ビルド時間は 2m54s
でした。
約35%のビルド時間削減になりました!(もちろん環境やイメージの内容にも依りますが)
ビルド時間の短縮以外で嬉しかったこと
ビルド中の画面出力が見やすくなっていました。
従来のビルドでは膨大な長さになる上に内容も分かりにくかったです。
BuildKit では、ステータスがレイヤ毎にまとめられています。
また、並列に処理が進んでいることが見て分かるようになってます。
まとめ
BuildKit を有効にしてビルド時間が短縮できることが確認できました。
BuildKit にはこの他にも機密情報をコンテナに渡すためのオプションや、SSH エージェントによる接続を許可するオプションなどが追加されているようです。またの機会に試してみたいと思います。
ちなみに、ビルドした Dockerfile はこちらです。