Docker aufräumen: Automatischer Cleanup mit Systemd

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:

  • -a entfernt 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 Uhr
  • Persistent=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.