Buildah vs Kaniko: Rootless Container Images in CI/CD im Vergleich 2026
Wer Container-Images in einer CI/CD-Pipeline baut, kommt traditionell an Docker nicht vorbei — doch docker build im Container setzt einen privilegierten Docker-Daemon voraus. Das ist ein erhebliches Sicherheitsrisiko, besonders in Kubernetes-Pipelines. Buildah (Red Hat) und Kaniko (Google) lösen dieses Problem auf unterschiedliche Weisen: beide bauen OCI-konforme Container-Images ohne Root-Rechte und ohne Docker-Daemon. Dieser Vergleich zeigt, wann welches Tool die bessere Wahl ist.
Das Problem: Docker-in-Docker ist ein Sicherheitsrisiko
Das klassische docker build in CI/CD erfordert Zugriff auf den Docker-Socket (/var/run/docker.sock). Wer diesen Socket in einen CI-Pod einhängt, gibt dem Container Root-Äquivalenz über den gesamten Kubernetes-Node — ein bekanntes Angriffsziel.
Docker-in-Docker (DinD) als privilegierter Sidecar ist kaum besser: Der Sidecar-Container läuft als privileged: true, was ebenfalls Node-Eskalation ermöglicht.
Buildah und Kaniko sind die wichtigsten Antworten der Cloud-Native-Welt auf dieses Problem.
Was ist Buildah?
Buildah ist ein CLI-Tool von Red Hat zum Erstellen von OCI/Docker-Images ohne Daemon. Es ist Teil der containers/buildah-Toolchain (zusammen mit Podman und Skopeo) und nutzt Linux User Namespaces für rootless Builds.
Stärken von Buildah:
- Vollständig Open Source (Apache 2.0)
- Rootless-Betrieb via Linux User Namespaces
- Direkte Manipulation von Image-Layern (ohne Dockerfile)
- Kompatibel mit Podman, Skopeo und dem gesamten
containers-Ökosystem - Native Integration in RHEL/CentOS/Fedora-Umgebungen
- Eigene Skript-API (
buildah from,buildah run,buildah commit) - Unterstützt Dockerfile und eigene Build-Scripte (Shell/Bash)
Schwächen von Buildah:
- Erfordert UserNS-Unterstützung im Kernel (Linux 4.18+)
- In einigen Kubernetes-Deployments komplizierter zu konfigurieren als Kaniko
- Weniger verbreitet in Cloud-CI-Systemen (GitHub Actions, GitLab CI)
Was ist Kaniko?
Kaniko wurde von Google entwickelt und ist heute das meistgenutzte Tool für Container-Image-Builds in Kubernetes. Kaniko läuft als Container (kein Daemon, keine Root-Rechte auf dem Node) und baut Images direkt aus einer Dockerfile.
Stärken von Kaniko:
- Sehr einfaches Konzept: Kaniko-Container läuft im Cluster, baut aus Dockerfile
- Hervorragende Kubernetes-Integration (als Job oder Init-Container)
- Snapshot-basierter Layer-Bau (ähnlich docker build)
- Unterstützt Docker Hub, ECR, GCR, GHCR, eigene Registries
- Breite Adoption in GitLab CI, Tekton, Argo Workflows
- Offizielles Google-Image (
gcr.io/kaniko-project/executor) - Cache-Layer-Unterstützung via Registry-Cache (
--cache=true)
Schwächen von Kaniko:
- Nur für Kubernetes/CI-Umgebungen optimiert (kein lokaler Dev-Build-Flow)
- Dockerfile muss im Executor-Container verfügbar sein (context via ConfigMap, Git, S3)
- Einige Dockerfile-Features werden nicht unterstützt (z. B. bestimmte RUN-Konstrukte mit Mounts)
- Kein Rootless im eigentlichen Sinne — läuft als root im Container, ohne Host-Privilegien
Technischer Vergleich
| Merkmal | Buildah | Kaniko |
|---|---|---|
| Rootless | ✓ (User Namespaces) | Teilweise (kein Host-Root) |
| Kubernetes-nativ | Möglich, komplexer | ✓ (designed for K8s) |
| Dockerfile-Support | ✓ | ✓ |
| Eigene Build-Skripte | ✓ (buildah-API) | Nur Dockerfile |
| Registry-Push | ✓ (via Skopeo) | ✓ (direkt) |
| Layer-Cache | ✓ | ✓ (Registry-Cache) |
| Lokale Nutzung | ✓ | Eingeschränkt |
| Multi-Stage Builds | ✓ | ✓ |
| ARM-Support | ✓ | ✓ |
| Maintainer | Red Hat / Community | Google / Community |
Kaniko in GitLab CI
Das häufigste Einsatzszenario für Kaniko ist als Container in einer GitLab CI- oder GitHub Actions-Pipeline:
# .gitlab-ci.yml
build-image:
stage: build
image:
name: gcr.io/kaniko-project/executor:v1.23.0-debug
entrypoint: [""]
script:
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"registry.example.com\":{\"auth\":\"$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor
--context "${CI_PROJECT_DIR}"
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination "registry.example.com/myapp:${CI_COMMIT_SHORT_SHA}"
--destination "registry.example.com/myapp:latest"
--cache=true
--cache-repo "registry.example.com/myapp/cache"
only:
- main
Der gesamte Build findet im Kaniko-Container statt — kein Docker-Socket, kein privilegierter Modus.
Buildah in einer Tekton-Pipeline
Für Kubernetes-native CI/CD mit Tekton ist Buildah die häufig gewählte Alternative:
# tekton-buildah-task.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: buildah-build-push
spec:
params:
- name: IMAGE
description: "Ziel-Image (z.B. registry.example.com/myapp:tag)"
- name: CONTEXT
default: "."
workspaces:
- name: source
steps:
- name: build-and-push
image: quay.io/buildah/stable:v1.35
securityContext:
privileged: false
runAsUser: 1000
script: |
buildah bud \
--tls-verify=false \
--layers \
-f Dockerfile \
-t $(params.IMAGE) \
$(params.CONTEXT)
buildah push \
--tls-verify=true \
$(params.IMAGE) \
docker://$(params.IMAGE)
volumeMounts:
- name: varlibcontainers
mountPath: /var/lib/containers
volumes:
- name: varlibcontainers
emptyDir: {}
Buildah benötigt hier kein privileged: true, wenn UserNamespaces im Cluster aktiviert sind — das ist der entscheidende Sicherheitsvorteil.
Multi-Stage Builds und Layer-Cache
Beide Tools unterstützen Docker-Multi-Stage-Builds. Der Cache-Mechanismus unterscheidet sich:
Kaniko Registry-Cache:
/kaniko/executor \
--dockerfile=Dockerfile \
--context=dir://workspace \
--destination=registry.example.com/myapp:latest \
--cache=true \
--cache-repo=registry.example.com/myapp-cache \
--cache-ttl=24h
Buildah Layer-Cache (lokal oder via Overlay-Storage):
buildah bud \
--layers \
--cache-from registry.example.com/myapp:latest \
-t registry.example.com/myapp:new \
.
Kanikos Registry-Cache ist praktischer für verteilte CI-Systeme, da der Cache in der Registry selbst liegt und von beliebig vielen Agents genutzt werden kann.
Wann Buildah, wann Kaniko?
Buildah ist die richtige Wahl wenn:
- Rootless auf Kernel-Level (User Namespaces) Voraussetzung ist
- Lokale Entwicklung und CI auf derselben Toolchain basieren sollen (Podman-Workflow)
- Custom Build-Skripte jenseits von Dockerfile nötig sind
- RHEL/CentOS/OpenShift-Umgebungen genutzt werden
- Tekton als CI-System im Einsatz ist
Kaniko ist die richtige Wahl wenn:
- Kubernetes-basierte CI/CD (GitLab CI, Argo Workflows, Tekton) im Einsatz ist
- Schneller Einstieg ohne Kernel-Konfiguration gewünscht wird
- Dockerfile als einziges Build-Format ausreicht
- Cloud-Provider-Registries (GCR, ECR, GHCR) genutzt werden
- Registry-Layer-Caching für schnelle Builds im Team wichtig ist
Alternativen: ko, img, Buildkit
- ko (Google): Speziell für Go-Anwendungen — kein Dockerfile nötig, baut direkt aus Go-Source
- BuildKit (
docker buildx): Modernes Docker-Build-Backend mit rootless-Modus (erfordert jedoch often noch Daemon) - img (Jessie Frazelle): Rootless Builder auf BuildKit-Basis — weniger aktiv maintained
- Podman + Buildah: Vollständige rootless Container-Toolchain für lokale Entwicklung
Fazit
Buildah und Kaniko sind beide solide, sicherheitsorientierte Alternativen zu Docker-in-Docker — die Wahl hängt vom Ökosystem ab. Wer auf Kubernetes und standardisierte CI/CD-Systeme setzt, greift 2026 in den meisten Fällen zu Kaniko: es ist einfacher zu integrieren, breit adoptiert und läuft ohne Kernel-Anforderungen. Wer hingegen in der Red-Hat-/Podman-Welt zu Hause ist oder maximale Rootless-Sicherheit auf Kernel-Ebene benötigt, macht mit Buildah die bessere Wahl.
In beiden Fällen gilt: Docker-Socket-Mounting oder DinD mit privileged: true sind in sicherheitsbewussten Kubernetes-Umgebungen 2026 keine akzeptable Option mehr.
Weiterführende Artikel
- Podman Compose vs Docker Compose: Rootless Container-Orchestrierung im Vergleich 2026
- Trivy vs Grype: Container-Image Vulnerability Scanning für Kubernetes im Vergleich 2026
- ArgoCD vs Flux CD: GitOps für Kubernetes im Vergleich 2026
- Crossplane vs. Terraform: Infrastructure-as-Code für Kubernetes im Vergleich 2026