Container Image Management: Buildah & Skopeo (Artikel 105)
Professionelles Management von Container-Images unter RHEL. Erfahren Sie, wie Sie Images ohne Docker-Dämon mit Buildah bauen und mit Skopeo über Registries synchronisieren.
# Image Management Masterclass: Buildah und Skopeo
TL;DR / Management Summary In der RHEL-Welt bauen wir Images nicht mit Docker. Wir nutzen Buildah, um Container-Images im “Bauhof”-Modus zu erstellen – ohne laufenden Dämon und sogar ohne Dockerfile (Skript-basiert). Zur Verwaltung und zum Transfer zwischen Registries (z.B. von Docker Hub zu Harbor) nutzen wir Skopeo. Diese Tools sind modular, sicher und perfekt für CI/CD-Pipelines geeignet.
# 1. Einführung & Architektur
Die Trennung der Werkzeuge.
Während Docker alles in einem Binary vereint, folgt Red Hat dem Unix-Prinzip: “Do one thing and do it well”.
- Buildah: Baut Images (Build).
- Skopeo: Inspiziert und kopiert Images (Inspect & Transport).
- Podman: Führt Container aus (Run).
graph LR
A[Buildah: Build Image] --> B[Local Image Store]
B --> C[Skopeo: Sync / Copy]
C --> D[Private Registry: Harbor / Quay]
D --> E[Podman: Pull & Run]
# 2. Buildah: Images bauen wie ein Profi
Weg vom Dockerfile-Zwang.
Buildah kann Dockerfiles verarbeiten, ist aber mächtiger, wenn man es via Bash-Skript nutzt.
# Beispiel: Build ohne Dockerfile
# 1. Neuen Arbeitscontainer aus UBI erstellen
newcontainer=$(buildah from ubi9-minimal)
# 2. Pakete installieren (direkt auf dem Host-Dateisystem des Containers!)
buildah run $newcontainer -- microdnf install -y nginx
# 3. Datei kopieren
buildah copy $newcontainer index.html /var/www/html/
# 4. Metadaten setzen
buildah config --entrypoint "/usr/sbin/nginx -g 'daemon off;'" $newcontainer
# 5. Image speichern (Commit)
buildah commit $newcontainer my-custom-nginx
# 3. Skopeo: Der Registry-Manager
Blick in die Ferne.
Skopeo erlaubt es, Informationen über ein Image zu erhalten, ohne es herunterladen (Pull).
# Image-Details abfragen
skopeo inspect docker://docker.io/library/nginx:latest
# Images zwischen Registries kopieren (Sync)
Ideal, um Images vom Internet in die sichere Firmen-Registry zu schieben:
skopeo copy \
docker://docker.io/library/nginx:latest \
docker://registry.company.com/library/nginx:latest
# 4. Day-2 Operations: Registry Management
Ordnung in der Registry.
# Lokales Aufräumen
Da Buildah und Podman den gleichen Speicher (/var/lib/containers) nutzen, sehen beide die gleichen Images.
buildah images
buildah rmi <id>
# 5. Troubleshooting & “War Stories”
Wenn der Build fehlschlägt.
# Story 1: “Der Layer-Overhead”
Symptom: Das Image ist 2GB groß, obwohl nur ein kleines Script installiert wurde.
Ursache: In einem Dockerfile erzeugt jedes RUN einen neuen Layer. Wenn man in einem Layer dnf install macht und im nächsten dnf clean, bleiben die Daten im vorherigen Layer gespeichert (verschwendeter Platz).
Lösung: Nutzen Sie Buildah im Skript-Modus (siehe oben). Da Sie nur am Ende commit machen, hat das Image am Ende nur einen sauberen Layer.
# Story 2: “Authentication Failure in CI/CD”
Symptom: Das Kopieren via Skopeo schlägt fehl, obwohl podman login gemacht wurde.
Ursache: Skopeo nutzt standardmäßig eine eigene Credentials-Datei oder erwartet die Übergabe via Parameter.
Lösung: Nutzen Sie das Flag --authfile /run/user/1000/containers/auth.json oder übergeben Sie die Daten direkt:
skopeo copy --src-creds user:pass --dest-creds user:pass ....
# 6. Fazit & Empfehlung
- Sicherheit: Buildah benötigt keinen Root-Dämon. Es ist das sicherste Tool für Jenkins/GitLab Runner.
- Wartbarkeit: Nutzen Sie Skopeo, um Ihre eigene Registry regelmäßig mit Upstream-Updates zu synchronisieren (Mirroring).
- Modularität: Verwenden Sie für jede Aufgabe das spezialisierte Tool. Mischen Sie nicht
podman buildundbuildah, wenn Sie komplexe Skripte bauen.
# Anhang: Cheatsheet
| Aufgabe | Tool & Befehl |
|---|---|
| Build aus Dockerfile | buildah bud -t myimage . |
| Image auf Disk mounten | buildah mount <container_id> |
| Image remote löschen | skopeo delete docker://registry... |
| Registry Login Test | skopeo login registry... |
| Alle Layer flachklopfen | buildah commit --squash <id> |