概要
- BuildKit はDockerfileビルドエンジンの裏側にある高機能なビルド基盤
- LLB という中間表現とプラグイン可能なフロントエンド設計
- キャッシュ と並列化で高速かつ再現性の高いビルドを実現
- Dockerfile以外 の独自仕様や出力形式にも柔軟に対応
- EarthlyやDagger など多くのプロジェクトがBuildKitを基盤として採用
BuildKitとは何か
- BuildKit は一般的なビルドフレームワークであり、単なるDockerfileビルダーではない
- OCIイメージ だけでなく、tarballやローカルディレクトリ、APKやRPMなど多様な成果物を生成可能
- Dockerfile は数あるフロントエンドの一つに過ぎず、独自フロントエンドの開発も可能
アーキテクチャの概要
-
LLB(Low-Level Build definition) はBuildKitの中核となる中間表現
- プロトコルバッファ形式のバイナリで、ファイルシステム操作のDAG(有向非巡回グラフ)を記述
- 内容アドレス指定 により、同一操作は同一ハッシュとなり強力なキャッシュを実現
- DockerfileフロントエンドはDockerfileをパースしLLBを生成
- LLBを生成できればどんなプログラムでもBuildKitを駆動可能
-
フロントエンド はビルド定義(Dockerfile, YAML, JSON, HCLなど)をLLBに変換するコンテナイメージ
- BuildKit Gateway API経由でビルドコンテキストとビルドファイルを受け取り、LLBグラフを返却
- ビルド言語はBuildKit本体に固定されておらず、完全なプラグイン方式
- YAMLやTOML、独自DSLなど好みの仕様でフロントエンドを開発可能
- Dockerfile先頭の
# syntax=ディレクティブでフロントエンドイメージを指定- 例:
# syntax=docker/dockerfile:1がデフォルト
- 例:
-
ソルバーとキャッシュ はLLBグラフを実行
- 各DAGノードは内容アドレス指定され、入力が同じなら完全にキャッシュ利用
- 従来のDockerビルダーよりも細かい粒度で高速なキャッシュや並列実行を実現
- キャッシュはローカル、イメージ埋め込み、リモートレジストリなど多様に対応
- CI環境間でも再利用や共有が容易
画像以外の成果物出力
--outputフラグで多彩な出力形式を選択可能type=image:レジストリへプッシュ(docker buildのデフォルト)type=local,dest=./out:最終ファイルシステムをローカルディレクトリへtype=tar,dest=./out.tar:tarballとしてエクスポートtype=oci:OCIイメージtarballとして出力
- type=local は非イメージ用途で特に有用
- バイナリ、パッケージ、ドキュメントなど任意成果物の生成・出力
- コンテナイメージ不要、柔軟なビルドパイプライン構築が可能
- Earthly、Dagger、Depot などのプロジェクトもBuildKitのLLBを基盤として利用
カスタムフロントエンドによるAPKパッケージビルド例
-
apkbuild :YAML仕様を読み込みAlpine APKパッケージを生成するBuildKitカスタムフロントエンド
- Dockerfile不要、YAMLでビルド仕様を記述
- LLB操作でソースビルドからAPK生成まで一貫実行
- 例:Chainguardのmelangeの簡易版
- YAML以外にもJSONやTOML、独自DSLでも対応可能
-
サンプルYAML仕様
- name, version, epoch, url, license, description, sourcesなどを記述
- 必要最低限の情報でビルド定義が完結
-
実行手順
- フロントエンドイメージのビルド:
docker build -t tuananh/apkbuild -f Dockerfile . - APKパッケージビルド:
cd example docker buildx build \ -f spec.yml \ --build-arg BUILDKIT_SYNTAX=tuananh/apkbuild \ --output type=local,dest=./out \ . - BUILDKIT_SYNTAX でカスタムフロントエンドを指定
--output type=localで生成ファイルを./outに保存、イメージやレジストリ不要
- フロントエンドイメージのビルド:
BuildKitの意義と活用可能性
- 内容アドレス指定・並列化・キャッシュ を備えた高性能ビルドエンジンを無償で利用可能
- フロントエンドを開発しLLBへ変換すれば、ビルド処理はBuildKitに任せられる
- CI/CDや複雑なビルドパイプライン基盤としても実績多数
- DaggerはCI/CDの実行エンジンとしてLLBを利用
- EarthlyはEarthfileをLLBに変換してビルド
- 独自ツールや成果物生成、マルチステップビルドの基盤としてBuildKitの活用を推奨
- Dockerfileは単なるデフォルトフロントエンド
- 本質的な強みはエンジンの柔軟性と拡張性にあり