34 Pruning und Storage Cleanup

Container-Workflows erzeugen Artefakte in hoher Frequenz: Images, Layer, Container, Netzwerkdefinitionen, Volumes, temporäre Build-Dateien. In Entwicklungs- und CI-Umgebungen steigt dieser Datenbestand exponentiell, wenn er nicht kontrolliert bereinigt wird. Pruning und Storage Cleanup sind deshalb keine kosmetischen Aufgaben, sondern essenzielle Maßnahmen zur Sicherstellung stabiler, reproduzierbarer und performanter Systeme. Podman bietet hierfür granularere, präzisere Mechanismen als klassische daemonbasierte Engines.

34.1 Warum Storage sich schleichend füllt

Jeder Build erzeugt neue Layer. Jeder Pull lädt neue Digests. Selbst wenn Container längst nicht mehr existieren, können ihre referenzierten Layer im Storage verweilen. In rootless-Setups liegt dieser Storage im Home-Verzeichnis des Benutzers und wächst unbemerkt, bis er in Konflikt mit anderen Entwicklungsprozessen gerät.

Der Kern des Problems ist das Layer-Referenzmodell: solange irgendeine Referenz existiert – ein Tag, ein Container, ein Manifest –, bleibt die Layer erhalten. Stillehüter sind häufig Build-Artefakte aus Feature-Branches, einmal verwendete Basisimages oder Zwischenlayer aus Multi-Stage-Builds.

Ein diagnostisches Mittel ist podman system df, das ähnlich wie das Docker-Pendant einen Überblick über genutzte, ungenutzte und potenziell freigebbare Ressourcen liefert.

34.2 Die grundlegenden Pruning-Mechanismen

Podman trennt Cleanup-Aufgaben in verschiedene Zielgruppen. Das ermöglicht deutlich präzisere Kontrolle, erfordert aber auch ein Verständnis der Zusammenhänge.

34.2.1 Image-Pruning

podman image prune entfernt ausschließlich Images, die von keinerlei Container referenziert werden. Unbenannte oder dangling Tags sind primäre Kandidaten. Besonders Build-intensive Projekte profitieren von dieser Maßnahme. Images, die einzig über manuell gesetzte Tags existierten, verschwinden erst, wenn diese Tags entfernt wurden.

34.2.2 Container-Pruning

podman container prune löscht Container, die im Status „exited“ oder „created“ stehen. Diese Container haben keinen Laufzeitnutzen mehr, blockieren aber Referenzen auf Images und Volumes.

Ein häufiger Effekt: Auch wenn das entsprechende Image bereits unbenutzt erscheint, kann ein vergessener exited-Container verhindern, dass es gelöscht wird. Erst das Container-Pruning macht das Image-Pruning wirksam.

34.2.3 Volume-Pruning

Volumes sind persistent – per Definition. Sie leben über Container-Lifecycles hinweg. podman volume prune löscht nur solche Volumes, die tatsächlich keiner Ressource mehr zugeordnet sind. In produktionsnahen Setups ist das ein sensibler Bereich, daher sollte Volume-Pruning mit Bedacht eingesetzt werden.

34.2.4 Netzwerk-Pruning

podman network prune entfernt nutzlose benutzerdefinierte Netzwerke. Besonders bei lokalen Testaufbauten, in denen mehrere isolierte Services simuliert werden, sammeln sich zahlreiche vergessene Netzwerke an.

34.2.5 System-Pruning

podman system prune ist der Rundumschlag: Images, Container, Volumes, Netzwerke – alles, was ungenutzt ist, wird entfernt, sofern es keine harten Referenzen mehr besitzt. Für CI/CD-Pipelines ist dies oft der effektivste Ansatz, da jede Pipeline mit einer sauberen Umgebung arbeitet.

34.3 Der Unterschied zwischen unreferenziert und unbenutzt

Ein Image kann unbenutzt wirken, aber noch referenziert sein. Der typische Fall:

Tag gelöscht → Digest bleibt Container gelöscht → Volume bleibt Manifest gelöscht → Teil-Images bleiben

Layer-basierte Engines löschen nur das, was sicher frei ist. Das bedingt, dass Pruning teils stufenweise erfolgen muss: erst Container, dann Images, dann Volumes.

Ein häufiger Stolperstein sind Manifeste. podman manifest rm entfernt lediglich die Manifestliste, nicht die darunterliegenden Images. Dadurch bleiben viele Layer zurück, bis explizit ein Image-Prune ausgeführt wird.

34.4 Cleanup in Rootless-Umgebungen

Rootless-Podman nutzt $HOME/.local/share/containers/storage. Dieser Pfad ist vielfach unbemerkt ein Speicherfresser. Entwickler arbeiten häufig mit mehreren Projekten, mehreren App-Versionen, mehreren Experimenten. Ein systematisches Cleanup ist hier unverzichtbar.

Ein nützlicher Ablauf für produktionsnahe Workflows:

  1. Stopped Container entfernen
  2. Untagged Images prüfen
  3. Build Cache löschen
  4. Netzwerke auf sinnvolle Anzahl begrenzen

CI-Systeme fahren zusätzlich nach jedem Job ein vollständiges system prune.

34.5 Build Cache und temporäre Layer

Build-Systeme wie Buildah (von Podman intern verwendet) erzeugen temporäre Layer, die als Cache dienen. Diese Layer beschleunigen Builds erheblich, doch sie verharren im Storage, wenn sie nicht bereinigt werden. Podman entfernt diese Art von Layern nicht automatisch.

Ein gezieltes Löschen des Build-Caches wirkt hier Wunder. Viele Teams erstellen dafür periodische Jobs, die je nach Build-Frequenz täglich oder wöchentlich laufen.

34.6 Cleanup-Strategien für CI/CD

In Pipelines ist deterministischer Zustand wichtiger als Build-Geschwindigkeit. Ein zwischen Builds geteilter Cache führt zu nicht reproduzierbaren Ergebnissen oder – schlimmer – zu emergenten Fehlern, die erst Tage später sichtbar werden.

Die klare Empfehlung:

Ein Lightweight-Container pro Job ist die stabilste, aber auch ressourcenintensivste Variante.

34.7 Storage Hygiene in Langzeitprojekten

Lang laufende Projekte erzeugen Fragmente im Storage – Versionen, Patches, Hotfixes, experimentelle Branches, die nie wieder gebraucht werden. Die eigentliche Herausforderung liegt nicht im fehlenden Pruning, sondern darin, dass niemand weiß, welche Artefakte noch benötigt werden.

Hier haben sich automatisierte Abläufe bewährt:

In Enterprise-Setups wird dieses Pruning häufig an Registries gespiegelt: Artifacts bleiben in der Registry, aber nicht im lokalen Storage. Das reduziert den Entwickler-Footprint erheblich.

34.8 Visualisierung des Storage-Lebenszyklus

Selbst ohne ausgefeilte UI kann man den Lebenszyklus interner Artefakte visualisieren:

Jede Phase repräsentiert einen eigenen Zustand und bietet eigene Cleanup-Punkte.