Docker vs Kaniko: daemonなしでイメージをビルドする
Dockerは特権的なdaemon経由でイメージをビルドする。KanikoはDockerfileからコンテナ内でdaemonなし、rootなしでビルドし、Kubernetesに理想的だ。
Dockerは標準的なイメージビルダーだが、daemonと通常は特権アクセスを必要とする。Kaniko (Google) は、コンテナ内で完全にuserspaceでDockerfileからイメージをビルドする - daemonなし、Docker socketなし - ため、非特権のKubernetesベースCIでイメージをビルドするのに人気がある。
| Docker | Kaniko | |
|---|---|---|
| daemonの要否 | 必要 | 不要 |
| 特権 | しばしば特権 | 非特権 |
| 最適な環境 | VM、標準runner | Kubernetes、制限されたrunner |
| ローカル開発との一致 | 高い | ビルドのみ |
| cache | layer cache + BuildKit | registryへの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のセキュリティと分離の制約で選ぶ。