できない.dev

BuildKit

別名: DOCKER_BUILDKIT / ビルドキット / buildkitd

Docker の現行ビルドエンジン。
命令の依存関係をグラフとして解析して並列実行し、レイヤーキャッシュやビルドシークレットを従来のビルダーより細かく扱える。

公開:

定義

BuildKitDocker のイメージビルドを担う現行のビルドエンジンです。
Dockerfile を上から順に実行するのではなく、命令の依存関係を解析してグラフに落とし、互いに依存しない部分を並列に処理します。
Docker Engine v23.0 以降では既定のビルダーとして使われます。

詳細

BuildKit は結果に影響しないステージを飛ばすため、ビルドログに出る順序が Dockerfile の記述順と一致しません。
キャッシュの単位も細かく、COPY の対象ファイルの内容が変わったかどうかでレイヤーの再利用を判断します。
ビルドシークレットや SSH エージェントの転送といった、イメージに残さず一時的に値を渡す仕組みも BuildKit 側の機能です。

DOCKER_BUILDKIT=1 docker build .   # 旧ビルダーが既定の環境で明示的に有効化する
docker buildx build --progress=plain .   # 出力を折りたたまずに全ログを見る

.dockerignore の解釈も BuildKit が行うため、除外が効かないときは Dockerfile ではなくビルドコンテキストの送り方を疑います。

よくある誤解

  • DOCKER_BUILDKIT=1 を毎回付ける必要がある: 現行の Docker Engine では既定で有効です。
    付けるのは旧ビルダーが既定の古い環境だけです。
  • キャッシュはタイムスタンプで判定される: COPY は内容のハッシュを見ます。
    日付だけが変わったファイルではキャッシュは壊れません。

関連

ビルドに送られるファイル群は build context と呼びます。
キャッシュが効きすぎる症状は ビルドキャッシュが無効化されない、除外が効かない症状は .dockerignore が効かない を参照してください。