Docker aufräumen: Automatischer Cleanup mit Systemd
Wer Docker in CI/CD-Pipelines oder für mehrere Umgebungen (Test, Staging, Produktion) einsetzt, kennt das Problem: Mit der Zeit sammeln sich Images, gestoppte Container und Build-Cache an, bis irgendwann die Festplatte voll ist.
Der klassische Reflex ist docker system prune - aber wer denkt schon regelmäßig daran? Eine automatisierte Lösung muss her.
Die Lösung: Systemd Timer
Systemd Timer sind robuster als Cronjobs und in jeder modernen Linux-Distribution verfügbar. Wir brauchen zwei Dateien:
Der Service
# /etc/systemd/system/docker-cleanup.service
[Unit]
Description=Docker System Cleanup
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af --filter "until=24h"
Der Timer
# /etc/systemd/system/docker-cleanup.timer
[Unit]
Description=Run Docker Cleanup Daily
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
Aktivieren
sudo systemctl daemon-reload
sudo systemctl enable --now docker-cleanup.timer
Was bedeuten die Parameter?
Im Service:
-aentfernt auch ungenutzte Images, nicht nur "dangling" ones-füberspringt die Bestätigungsabfrage--filter "until=24h"schützt alles, was in den letzten 24 Stunden erstellt wurde
Im Timer:
OnCalendar=*-*-* 03:30:00- läuft täglich um 3:30 UhrPersistent=true- holt verpasste Läufe nach (z.B. wenn der Server nachts aus war)RandomizedDelaySec=300- bis zu 5 Minuten zufällige Verzögerung, nützlich bei mehreren Servern
Zeitformat-Beispiele
Das OnCalendar-Feld ist flexibel:
# Täglich um Mitternacht
OnCalendar=daily
# Jeden Montag um 4 Uhr
OnCalendar=Mon *-*-* 04:00:00
# Alle 6 Stunden
OnCalendar=*-*-* 00/6:00:00
# Werktags um 2 Uhr
OnCalendar=Mon..Fri 02:00
Mit systemd-analyze calendar lässt sich die Syntax testen:
systemd-analyze calendar "*-*-* 03:30:00" --iterations=5
Was ist mit meinen Datenbank-Volumes?
Keine Sorge: docker system prune löscht keine Volumes - auch nicht mit -a oder -f. Volumes werden nur entfernt, wenn explizit --volumes angegeben wird.
| Ressource | system prune |
system prune --volumes |
|---|---|---|
| Gestoppte Container | ✓ | ✓ |
| Ungenutzte Netzwerke | ✓ | ✓ |
| Dangling Images | ✓ | ✓ |
Ungenutzte Images (-a) |
✓ | ✓ |
| Volumes | ✗ | ✓ |
Eure Datenbank-Volumes sind also sicher, selbst wenn der Container gerade neu startet.
Nützliche Befehle
# Alle aktiven Timer anzeigen
systemctl list-timers
# Timer-Status prüfen
systemctl status docker-cleanup.timer
# Letzten Lauf prüfen
journalctl -u docker-cleanup.service
# Manuell auslösen (zum Testen)
sudo systemctl start docker-cleanup.service
Fazit
Mit diesem Setup läuft der Cleanup automatisch im Hintergrund, schützt aktuelle Ressourcen durch den 24-Stunden-Filter und lässt eure Volumes in Ruhe. Einmal eingerichtet, nie wieder volle Festplatten.