【ビルドキット】

BuildKit とは?

最終更新:
💡 依存関係とキャッシュを使って、イメージ作成を進めるエンジン

コンテナイメージなどを作るためのビルドエンジン。依存関係に基づく並列実行やキャッシュの再利用を行い、Dockerのビルドでも使われる。実際の速度や利用できる機能は、ビルド内容と環境による。

📌 このページのポイント
依存関係に沿って、ビルドを進めるDockerfileA:依存の準備必要なら実行B:素材の準備再利用できる結果C:イメージを組立AとBの結果を使うAとBが独立なら、並列に進められる速度は処理内容やキャッシュの状態による
AとBの結果をCが使う、説明用の依存関係です。矢印は設定から処理、処理から利用先への関係。青は処理、緑は使えるキャッシュの例で、常にBを再利用できる保証ではありません。
ひよこ ひよこ
普通のDockerビルドと別のコマンドなの?
ペンギン先生 ペンギン先生
BuildKitはビルドを行うエンジンだよ。DockerのLinuxイメージのビルドでは標準で使われている。docker buildなどのコマンドから利用するので、コマンドそのものの名前とは分けて考えよう。Windowsコンテナへの対応には別の条件があるんだ
ひよこ ひよこ
全部の命令を同時に実行するの?
ペンギン先生 ペンギン先生
依存しないステージなどは並列に処理できるけれど、前の結果が必要な処理は待つよ。使われないステージの処理を省くこともできる。どのくらい速くなるかは、依存関係やキャッシュの状態などによるんだ
ひよこ ひよこ
キャッシュはどう使うの?
ペンギン先生 ペンギン先生
処理の内容や入力ファイルの内容を調べて、使える結果を再利用するよ。同じビルドを繰り返すときの作業を減らせるけれど、ファイルや手順が変われば、必要な部分を作り直すんだ
ひよこ ひよこ
ARM向けのイメージが、そのままx86でも動く?
ペンギン先生 ペンギン先生
複数のプラットフォーム向けには、通常それぞれに合うイメージを作るんだ。--platformで対象を指定するだけでなく、エミュレーション、対象CPUのビルド環境、クロスコンパイルなどの準備も必要だよ。一つのバイナリがすべてのCPUで動くという意味ではないんだ
ひよこ ひよこ
パスワードはどう渡す?
ペンギン先生 ペンギン先生
ビルド時の--secret指定と、DockerfileのRUN --mount=type=secretを組み合わせて、必要な処理にだけ渡す方法があるよ。ARGやENVに秘密情報を入れる方法は避けよう。ただし、参照した内容をコマンドがファイルやログに書けば、その出力に残りうる。マウントを使うだけで、どんな処理も安全になるわけではないんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「BuildKit」って出てきたら「依存関係とキャッシュを使う、イメージ作成のエンジン」と思えればだいたいOK!
📖 おまけ:英語の意味
「BuildKit」 = ビルド用ツールキット
💬 Dockerのビルドで使われるエンジンの名前だよ。docker buildというコマンドを置き換える名前ではなく、その裏でビルドを行う仕組みなんだ

参考資料

← 用語集にもどる