BuildKitとは? Dockerのモダンなビルドエンジンを解説
BuildKitは、並列処理、よりスマートなcache、そしてbuild secretsやcache mountsといった機能によってimageを高速にビルドする、Dockerのモダンなビルドエンジンです。
BuildKitはDockerのレガシーなbuilderを置き換え、現在はデフォルトになっています。buildを並列化できるグラフとしてモデル化し、はるかに優れたcacheで変更されていない作業をスキップし、Dockerfileをより速く安全にする機能(secrets、SSHフォワーディング、cache mounts)を追加します。これは特にCIで有効です。
BuildKitとは
BuildKitは "docker build"(および "docker buildx")の背後にあるビルドエンジンです。Dockerfileを受け取り、buildステップの依存関係グラフを構築し、それらを効率的に実行します。高度なフロントエンド構文、エクスポート可能なcache、マルチプラットフォームbuildをサポートします。
なぜ速いのか
BuildKitは独立したbuildステージを並列に実行し、入力が変更されたlayerのみをrebuildし、cacheを外部ストアにインポートおよびエクスポートできるため、cacheはマシンやCIの実行をまたいで存続します。"RUN --mount=type=cache" のような機能はパッケージマネージャのcacheをbuild間で永続化し、build secretsは認証情報をlayerに焼き込むのを回避します。
使用例
cache mountはbuild間でパッケージのcacheをwarmに保ちます。
# syntax=docker/dockerfile:1
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN --mount=type=cache,target=/root/.npm npm ciCI/CDにおける役割
CIでは、BuildKitはimageのbuild時間を劇的に短縮しますが、そのcacheは実行間でcacheが永続化される場合にのみ役立ちます。新規のCIマシンはデフォルトではこれを提供しません。BuildKitのcacheを(例えばregistryに)エクスポートおよびインポートすることが鍵となる手法です。warmなBuildKitのcacheを保持するマネージドrunnerは、imageのbuildを大幅に高速で安価にし、自動retryが一時的なregistryの失敗を吸収します。
代替ツール
レガシーなDockerのbuilderはより遅く、これらの機能がありません。Buildahはdaemonなしでimageをビルドします。Kanikoとimgは、Kubernetesのような非特権環境でimageをビルドします。BuildKitは、典型的なDockerのworkflowにとってデフォルトかつ最も高機能なbuilderです。
重要なポイント
- BuildKitはDockerのモダンでデフォルトのビルドエンジンです。
- 並列処理、エクスポート可能なcache、cache mountsがbuildを高速化します。
- CIでは、速度向上を実現するために実行間でBuildKitのcacheを永続化します。