Compose-Update-Erkennung per Image-Digest statt pull --dry-run-Textscrape #42

Closed
opened 2026-06-02 09:20:25 +00:00 by chinux · 0 comments
Owner

Problem

Die Compose-Update-Prüfung ist unzuverlässig. Node-Agent/src/docker_compose.rs:13:

cd {p} && docker compose pull --dry-run 2>&1 || docker compose images 2>&1

Es wird pull --dry-run ausgeführt und der rohe Text zurückgegeben. Bei :latest zeigt das stets „Pulling/Pulled"-Aktivität, ohne verlässlich zu unterscheiden „Image wirklich neu" vs. „schon aktuell". Effektiv wird Text gegen einen beweglichen Tag gescrapet → keine belastbare „Update verfügbar"-Aussage. Beispiel-Output:

/root/docker-compose.yml: the attribute `version` is obsolete ...
Image vaultwarden/server:latest Pulling
Image vaultwarden/server:latest Pulled

Besser: Digest-Vergleich (wie Watchtower/diun)

Pro Image Remote- vs. Lokal-Digest vergleichen — definitives true/false, funktioniert für :latest und gepinnte Tags, ohne Layer zu ziehen:

  1. Images des Projekts ermitteln: cd {p} && docker compose config --images (eine Zeile je Image).
  2. Je Image:
    • Remote: docker manifest inspect <image> → Manifest-(Listen-)Digest. (Kein Layer-Pull.)
    • Lokal: docker image inspect <image> --format '{{index .RepoDigests 0}}' → aktuell laufender Digest.
    • remote != localUpdate verfügbar.
  3. Strukturierte Rückgabe statt Rohtext:
{ "services": [ { "image": "vaultwarden/server:latest",
                  "current_digest": "sha256:…", "latest_digest": "sha256:…",
                  "update_available": true } ],
  "update_count": 1 }

Umsetzung

  • compose_check (docker_compose.rs:8) auf obigen Ablauf umstellen; pro Image die zwei docker-Calls, Digests vergleichen, JSON bauen.
  • Fallback: wenn docker manifest inspect fehlschlägt (alte Docker-CLI / Registry-Auth fehlt), auf das bisherige pull --dry-run zurückfallen und update_available: null (unbekannt) melden — nicht hart fehlschlagen.
  • Backend/DockerTab: die strukturierte Antwort anzeigen („Update verfügbar: ja/nein" je Service) statt Rohtext.

Caveats (im Code berücksichtigen)

  • Private Registries: manifest inspect braucht ggf. Login (Docker-Config-Auth nutzen); bei 401 → Fallback/unknown.
  • Multi-Arch: RepoDigests enthält den Listen-Digest → Liste gegen Liste vergleichen ist korrekt.
  • Docker-Hub-Rate-Limits: Manifest-Fetch ist leicht (keine Layer), aber bei vielen Images bündeln/cachen.
  • version-obsolete-Warnung aus dem Output filtern (Noise).

Bezug

Eigenständig zu #31 (Pfad-Discovery), aber gleiche Feature-Familie: #31 liefert den Pfad, dieses Issue verbessert die Update-Erkennung auf diesem Pfad.

Branch

feat/compose-update-digest-check

## Problem Die Compose-Update-Prüfung ist unzuverlässig. `Node-Agent/src/docker_compose.rs:13`: ``` cd {p} && docker compose pull --dry-run 2>&1 || docker compose images 2>&1 ``` Es wird `pull --dry-run` ausgeführt und der **rohe Text** zurückgegeben. Bei `:latest` zeigt das stets „Pulling/Pulled"-Aktivität, ohne verlässlich zu unterscheiden „Image wirklich neu" vs. „schon aktuell". Effektiv wird Text gegen einen beweglichen Tag gescrapet → keine belastbare „Update verfügbar"-Aussage. Beispiel-Output: ``` /root/docker-compose.yml: the attribute `version` is obsolete ... Image vaultwarden/server:latest Pulling Image vaultwarden/server:latest Pulled ``` ## Besser: Digest-Vergleich (wie Watchtower/diun) Pro Image Remote- vs. Lokal-Digest vergleichen — definitives `true/false`, funktioniert für `:latest` **und** gepinnte Tags, ohne Layer zu ziehen: 1. Images des Projekts ermitteln: `cd {p} && docker compose config --images` (eine Zeile je Image). 2. Je Image: - Remote: `docker manifest inspect <image>` → Manifest-(Listen-)Digest. (Kein Layer-Pull.) - Lokal: `docker image inspect <image> --format '{{index .RepoDigests 0}}'` → aktuell laufender Digest. - `remote != local` ⇒ **Update verfügbar**. 3. Strukturierte Rückgabe statt Rohtext: ```json { "services": [ { "image": "vaultwarden/server:latest", "current_digest": "sha256:…", "latest_digest": "sha256:…", "update_available": true } ], "update_count": 1 } ``` ## Umsetzung - `compose_check` (`docker_compose.rs:8`) auf obigen Ablauf umstellen; pro Image die zwei `docker`-Calls, Digests vergleichen, JSON bauen. - Fallback: wenn `docker manifest inspect` fehlschlägt (alte Docker-CLI / Registry-Auth fehlt), auf das bisherige `pull --dry-run` zurückfallen und `update_available: null` (unbekannt) melden — nicht hart fehlschlagen. - Backend/`DockerTab`: die strukturierte Antwort anzeigen („Update verfügbar: ja/nein" je Service) statt Rohtext. ## Caveats (im Code berücksichtigen) - **Private Registries**: `manifest inspect` braucht ggf. Login (Docker-Config-Auth nutzen); bei 401 → Fallback/`unknown`. - **Multi-Arch**: `RepoDigests` enthält den Listen-Digest → Liste gegen Liste vergleichen ist korrekt. - **Docker-Hub-Rate-Limits**: Manifest-Fetch ist leicht (keine Layer), aber bei vielen Images bündeln/cachen. - `version`-obsolete-Warnung aus dem Output filtern (Noise). ## Bezug Eigenständig zu #31 (Pfad-Discovery), aber gleiche Feature-Familie: #31 liefert den Pfad, dieses Issue verbessert die Update-Erkennung auf diesem Pfad. ## Branch `feat/compose-update-digest-check`
chinux 2026-06-02 09:20:25 +00:00
  • closed this issue
  • added the
    agent
    label
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#42
No description provided.