Skip to content
Latchkey

Docker vs Kaniko: daemonなしでイメージをビルドする

Dockerは特権的なdaemon経由でイメージをビルドする。KanikoはDockerfileからコンテナ内でdaemonなし、rootなしでビルドし、Kubernetesに理想的だ。

Dockerは標準的なイメージビルダーだが、daemonと通常は特権アクセスを必要とする。Kaniko (Google) は、コンテナ内で完全にuserspaceでDockerfileからイメージをビルドする - daemonなし、Docker socketなし - ため、非特権のKubernetesベースCIでイメージをビルドするのに人気がある。

DockerKaniko
daemonの要否必要不要
特権しばしば特権非特権
最適な環境VM、標準runnerKubernetes、制限されたrunner
ローカル開発との一致高いビルドのみ
cachelayer cache + BuildKitregistryへのlayer cache

CIにおいて

Docker daemonを備えた標準的なVM runnerでは、Docker (BuildKit付き) が最もシンプルで高速だ。KanikoはKubernetes内でビルドする場合や、Docker socketや特権モードを禁止するrunner上でその居場所を得る - daemonなしにDockerfileからビルドしpushする。Kanikoのcacheは、ローカルなdaemon cacheではなくregistry cacheを介して機能する。

高速化する

registryにlayer cacheをpushして再利用し、再ビルドが変更されていないstageをスキップするようにする。両者はCI runnerで動く。高速なマネージドrunnerがイメージのビルドそのものを短縮する。

結論

daemonを備えた標準的なrunner: BuildKit付きのDocker。daemonなし、非特権、あるいはKubernetes内のビルド: Kaniko。runnerのセキュリティと分離の制約で選ぶ。

関連ガイド