#!/bin/bash # ============================================ # Docker Cleanup - Disk-Overflow verhindern # Raeumt alte Images, Container und Volumes auf # ============================================ # Aufruf: bash docker-cleanup.sh # Cron: 0 3 * * 0 bash /opt/scripts/docker-cleanup.sh # Quelle: sgit.space/downloads # ============================================ set -euo pipefail LOG="/var/log/docker-cleanup.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"; } if ! command -v docker &> /dev/null; then echo "Fehler: Docker nicht installiert." exit 1 fi log "===== Docker Cleanup gestartet =====" # Disk vor Cleanup BEFORE=$(docker system df --format '{{.Reclaimable}}' 2>/dev/null | head -1) log "Speicher rueckgewinnbar: $BEFORE" # Gestoppte Container entfernen STOPPED=$(docker ps -aq --filter status=exited | wc -l) if [ "$STOPPED" -gt 0 ]; then docker container prune -f >> "$LOG" 2>&1 log "Gestoppte Container entfernt: $STOPPED" fi # Ungenutzte Images (aelter als 48h) OLD_IMAGES=$(docker images --filter "dangling=true" -q | wc -l) docker image prune -af --filter "until=48h" >> "$LOG" 2>&1 log "Alte Images bereinigt (>48h)" # Ungenutzte Netzwerke docker network prune -f >> "$LOG" 2>&1 log "Ungenutzte Netzwerke bereinigt" # Ungenutzte Volumes (VORSICHT: nur dangling!) DANGLING=$(docker volume ls -qf dangling=true | wc -l) if [ "$DANGLING" -gt 0 ]; then log "WARNUNG: $DANGLING verwaiste Volumes gefunden" docker volume ls -f dangling=true --format " {{.Name}}" | tee -a "$LOG" # Auskommentiert fuer Sicherheit - manuell aktivieren: # docker volume prune -f >> "$LOG" 2>&1 log "Volume-Prune ist deaktiviert. Manuell pruefen!" fi # Build Cache docker builder prune -f --filter "until=72h" >> "$LOG" 2>&1 log "Build Cache bereinigt (>72h)" # Disk nach Cleanup AFTER=$(df -h / | awk 'NR==2 {print $4 " frei (" $5 " belegt)"}') log "Disk: $AFTER" log "===== Docker Cleanup fertig ====="