docker build vs BuildKit: CIでのより高速なイメージビルド
BuildKitはDocker向けの現代的なビルドbackendだ - stageを並列化し、cache mountとbuild secretをサポートし、今やデフォルトである。
レガシーなdocker buildは、粗いlayer cacheでDockerfileを逐次実行する。BuildKit (docker buildx経由で公開され、今やデフォルトのbuilder) は独立したstageを並列化し、cache mount、build secret、より豊富なcacheのexport/importを追加する - 同じDockerfileで大きなCIの高速化だ。
| docker build (レガシー) | BuildKit | |
|---|---|---|
| stageの並列化 | 逐次 | 並列 |
| cache mount | なし | あり (--mount=type=cache) |
| build secret | 回避策 | ネイティブ (--secret) |
| cacheのexport/import | 限定的 | 豊富 (registry、gha、ローカル) |
| ステータス | レガシー | デフォルトのbuilder |
CIにおいて
BuildKitは現代的なパイプラインでの明確な選択だ: 並列のstageが実時間を削減し、cache mountがパッケージのダウンロードをビルド間で温かく保ち、ghaまたはregistryのcache backendが1つのjobに別のjobのlayerを再利用させる。レガシーなdocker buildは古い構成のために依然存在するが、速度を取りこぼす。BuildKitを有効化する (最近のDockerではデフォルトでオン) か、docker buildxを使う。
高速化する
BuildKitのcacheをregistryまたはGitHub Actionsのcacheにexportし、次の実行で温かいlayerのためにimportする。ビルドは依然としてCI runnerで動く。高速なマネージドrunnerが実際のlayerのビルドを短縮する。
結論
BuildKit (buildx) を使う - それがデフォルトで、並列にビルドし、cache mountとsecretを追加する。非常に古い凍結された環境を除いて、レガシーなdocker buildに留まる理由はほとんどない。