Docker Compose Auto-Updater
Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und aktualisiert diese automatisch.
🚀 Features
- 🔄 Stack-basiertes Update Aktualisiert komplette Docker-Compose Stacks strukturiert und kontrolliert
- 🧪 Dry-Run Modus Zeigt an, was passieren würde, ohne Änderungen durchzuführen
- 📲 ntfy Benachrichtigungen Push-Notifications über ntfy bei Updates, Fehlern oder Status
- ⏭️ Exclude-Liste Einzelne Container oder komplette Stacks gezielt vom Update ausschließen
- 🗑️ Prune Funktion Entfernt nicht mehr benötigte Images/Container automatisch
- ⚡ Digest-basierter Update-Check (kein Blind-Pull) Images werden nicht pauschal gepullt. Stattdessen: Vergleich des lokalen Image-Digests mit dem Remote-Digest Pull nur bei tatsächlicher Änderung Spart Bandbreite, Zeit und unnötige Layer-Downloads
📂 Voraussetzungen
- Docker + Docker Compose (v2)
- Bash
- jq
- Optional: ntfy Server
⚙️ Konfiguration (config.conf)
# ==========================================================
# DOCKER COMPOSE UPDATER - CONFIG
# ==========================================================
# ----------------------------------------------------------
# PATH
# ----------------------------------------------------------
# Basisverzeichnis der Stacks [ String ]
PATH_COMPOSE_DIR="/pfad/zu/deinen/stacks"
# Compose-Dateiname [ String ]
PATH_COMPOSE_PATTERN="*compose*.yml"
# ----------------------------------------------------------
# LOG
# ----------------------------------------------------------
# Log-Datei [ String ]
LOG_FILE="/pfad/zum/log/update.log"
# Log-Level [ DEBUG | INFO | WARN | ERROR ]
LOG_LEVEL="INFO"
# ----------------------------------------------------------
# UPDATE
# ----------------------------------------------------------
# Nur Simulation, keine Änderungen [ true | false ]
UPDATE_DRY_RUN_ENABLED=false
# Gestoppte Container updaten [ true | false ]
UPDATE_INCLUDE_STOPPED=true
# Danach wieder starten [ true | false ]
UPDATE_START_STOPPED=false
# ----------------------------------------------------------
# REDEPLOY
# ----------------------------------------------------------
# Warten bis Container healthy [ true | false ]
REDEPLOY_WAIT_HEALTHY=true
# Timeout in Sekunden [ Number ]
REDEPLOY_TIMEOUT=60
# ----------------------------------------------------------
# EXCLUDES
# ----------------------------------------------------------
# Stacks vom Update ausschließen [ Array ]
EXCLUDE_STACKS=(
"example_stack_1"
"example_stack_2"
)
# Services vom Update ausschließen [ Array ]
EXCLUDE_SERVICES=(
"example_container_1"
"example_container_2"
)
# ----------------------------------------------------------
# NTFY SETTINGS
# ----------------------------------------------------------
# NTFY Zusammenfassung senden [ true | false ]
NTFY_ENABLED=true
# Server URL [ String ]
NTFY_URL="https://ntfy.example.com/topic"
# Token [ String ]
NTFY_TOKEN="DEIN_TOKEN"
# Titel mitsenden (optional) [ String ]
NTFY_TITLE="Docker Update ($(hostname))"
# Tags mitsenden (optional) [ String ]
NTFY_TAGS="docker,update"
# Icon mitsenden (optional) [ String ]
NTFY_IMAGE_URL="http://dein-server/host-icon.png"
# Nur senden wenn Updates vorhanden [ true | false ]
NTFY_ONLY_ON_CHANGES=false
# Versionsnummern anzeigen [ true | false ]
NTFY_SHOW_VERSIONS=true
# ----------------------------------------------------------
# DOCKER CLEANUP
# ----------------------------------------------------------
# Prune Befehle ausführen [ true | false ]
CLEANUP_ENABLED=true
# Nur nach erfolgten Updates ausführen [ true | false ]
CLEANUP_ONLY_ON_UPDATE=true
# Images löschen [ true | false ]
CLEANUP_IMAGES_ENABLED=true
# Image-Prune Modus [ dangling | unused ]
CLEANUP_IMAGES_MODE="unused"
# Container löschen [ true | false ]
CLEANUP_CONTAINERS_ENABLED=true
# Volumes löschen [ true | false ]
CLEANUP_VOLUMES_ENABLED=false
# Networks löschen [ true | false ]
CLEANUP_NETWORKS_ENABLED=true
▶️ Nutzung
chmod +x script.sh
./script.sh
🧠 Funktionsweise
- Alle
*compose*.ymlDateien werden rekursiv gefunden - Verarbeitung erfolgt alphabetisch (deterministische Reihenfolge)
- Für jeden Stack:
- Compose-Konfiguration wird ausgewertet (docker compose config)
- Verwendete Images werden extrahiert
- Für jedes Image:
- Remote-Digest wird aus der Registry abgefragt
- Lokaler Digest wird ermittelt
- Vergleich lokal vs. remote
- Entscheidungslogik:
- ❌ Kein Unterschied → kein Pull, kein Restart
- ✅ Digest unterschiedlich → Image wird gepullt
- Wenn mindestens ein Service ein Update hat:
- kompletter Stack wird neu deployed (docker compose up -d)
⚡ Verhalten im Detail
- Kein unnötiger Netzwerk-Traffic (kein blindes docker pull)
- Updates erfolgen nur bei tatsächlichen Änderungen
- Mehrere Services im Stack → einheitlicher Redeploy, kein Teilzustand
- Optional: Dry-Run zeigt exakt diese Entscheidungen ohne Ausführung
🗑️ Prune / Cleanup
Nach Abschluss der Updates kann optional ein Docker Cleanup durchgeführt werden. Dabei werden ungenutzte Ressourcen entfernt:
-
docker image prune
→ entfernt ungenutzte („dangling“) Images -
docker image prune -a
→ entfernt alle Images, die von keinem Container verwendet werden -
docker container prune
→ entfernt gestoppte Container -
docker volume prune
→ entfernt ungenutzte Volumes -
docker network prune
→ entfernt ungenutzte Netzwerke
🔔 ntfy Prioritäten
| Zustand | Priorität |
|---|---|
| ✔️ Keine Updates | 1 |
| 🔄 Updates vorhanden | 3 |
| ❌ Fehler | 5 |
📄 Beispiel Ausgabe
→ Prüfe Stack: homepage
├─ dockerproxy (image)
└─ homepage (image)
→ Prüfe Stack: app
├─ db (image)
⬆️ UPDATE
alt: sha256:abc
neu: sha256:def
└─ web (image)
🔄 Stack wird neu deployt
⚠️ Hinweise
Wird in einem Stack ein Container aktualisiert, wird anschließend der gesamte Stack neu gestartet, sofern er mehr als einen Container enthält. Dadurch wird sichergestellt, dass alle Abhängigkeiten wieder gemäß der docker-compose.yml ausgeführt werden.