From f93fb536386ed15d22784d195849cf50054bd9dc Mon Sep 17 00:00:00 2001 From: Thorsten Date: Wed, 1 Apr 2026 12:19:58 +0200 Subject: [PATCH] . --- README.md | 28 +++++++++++++++++----------- shell_docker_compose_update.sh | 18 +++++++++--------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index bab99c2..27f2d37 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,19 @@ --- -Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und aktualisiert diese automatisch. +> 🔧 Automatisches Update von Docker-Compose-Stacks mit feingranularer Steuerung per Labels ## 🚀 Features -- 🔄 Stack-basiertes Update +- 🔄 **Stack-basiertes Update** Aktualisiert komplette Docker-Compose Stacks strukturiert und kontrolliert -- 🧪 Dry-Run Modus +- 🧪 **Dry-Run Modus** Zeigt an, was passieren würde, ohne Änderungen durchzuführen -- 📲 ntfy Benachrichtigungen +- 📲 **ntfy Benachrichtigungen** Push-Notifications über ntfy bei Updates, Fehlern oder Status -- ⚙️ Service-Modi (per Label steuerbar) +- ⚙️ **Service-Modi** (per Label steuerbar) Einzelne Container oder komplette Stacks gezielt vom Update ausschließen -- 🗑️ Prune Funktion +- 🗑️ **Prune Funktion** Entfernt nicht mehr benötigte Images/Container automatisch @@ -41,7 +41,7 @@ Entfernt nicht mehr benötigte Images/Container automatisch - Compose-Konfiguration wird ausgewertet (`docker compose config`) - Services und deren Images werden ermittelt - Für jedes Image: - - Image wird (einmal pro Stack) gepullt (`docker pull`, nutzt Cache) + - Image wird bei Bedarf gepullt (maximal einmal pro Image und Stack, Cache-basiert) - Lokale Image-ID wird ermittelt - Image-ID des vorhandenen Containers wird ermittelt (auch für gestoppte Container) 4. Entscheidungslogik: @@ -59,9 +59,12 @@ Entfernt nicht mehr benötigte Images/Container automatisch 6. Sonderverhalten: - Gestoppte Container werden ebenfalls geprüft und bei Updates berücksichtigt - Gestoppte Container werden nach dem Update optional wieder gestoppt - - Excluded Services werden gepullt, aber **nicht** neu gestartet. - Verfügbare Updates werden erkannt und per NTFY gemeldet. - - Healthchecks können optional abgewartet werden + - Service-Verhalten wird vollständig über Labels gesteuert (`composeupdater.mode`) + - Je nach Modus werden Services: + - komplett ignoriert (`ignore`) + - nur überwacht (`notify-only`) + - oder automatisch aktualisiert (`update`) + --- @@ -139,7 +142,7 @@ services: - composeupdater.mode=update ``` -#### 📦 Stack-Level Label (optional) +#### 📦 Stack-Level Label Du kannst das Verhalten auch für den gesamten Stack setzen: @@ -147,6 +150,9 @@ Du kannst das Verhalten auch für den gesamten Stack setzen: labels: - composeupdater.mode=ignore ``` +Das Stack-Level Label definiert den Standard für alle Services im Stack +Service-Labels können diesen Standard überschreiben + --- diff --git a/shell_docker_compose_update.sh b/shell_docker_compose_update.sh index e638c6f..e61daa2 100644 --- a/shell_docker_compose_update.sh +++ b/shell_docker_compose_update.sh @@ -298,12 +298,6 @@ while IFS= read -r -d '' file; do stack_mode=$(get_stack_mode) - if [ "$stack_mode" = "ignore" ]; then - log INFO "→ Stack $stack übersprungen (label=ignore)" - cd "$PATH_COMPOSE_DIR" - continue - fi - mapfile -t services < <(docker compose config --services) total_services=${#services[@]} current_index=0 @@ -336,8 +330,16 @@ while IFS= read -r -d '' file; do continue fi + # ============================= + # Mode bestimmen (Service > Stack) + # ============================= + mode=$(get_service_mode "$svc") + if [ -z "$mode" ]; then + mode="$stack_mode" + fi + case "$mode" in ignore) @@ -355,6 +357,7 @@ while IFS= read -r -d '' file; do continue fi + # 👉 Pull nur einmal pro Image if [ -z "${pulled_images[$image]:-}" ]; then pull_with_retry "$image" || true pulled_images[$image]=1 @@ -392,8 +395,6 @@ while IFS= read -r -d '' file; do # Pull + Vergleich # ============================= - - # 👉 Pull (nutzt Cache → schnell wenn nichts neu) if [ -z "${pulled_images[$image]:-}" ]; then if ! pull_with_retry "$image"; then log ERROR " ❌ Pull fehlgeschlagen" @@ -408,7 +409,6 @@ while IFS= read -r -d '' file; do after_id=$(get_local_image_id "$image") if ! container_exists "$svc"; then - # 👉 Container existiert nicht → KEIN Update update_needed=false elif [ "$before_id" != "$after_id" ]; then