compose_check: Digest-Vergleich bei Multi-Arch-Images falsch — dauerhafter False-Positive bei :latest #91
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem (live reproduziert)
Der Compose-Update-Check meldet bei Multi-Arch-Images (z. B.
jc21/nginx-proxy-manager:latest) dauerhaft "Update verfuegbar" — auch unmittelbar nach erfolgreichem Update + Recheck.Ursache
compose_checkvergleicht zwei verschiedene Digest-Ebenen (VM-Guest-Agent/src/collect/mod.rs:137-138):Bei Multi-Arch-Images ist
remder Index-Digest (Sammeldigest ueber alle Architekturen),curje nach Image-Store der per-Arch-Digest. Die sind strukturell verschieden → immer ungleich → permanenter False-Positive. Single-Arch-Images sind nicht betroffen (deshalb faellt es nur bei manchen Images auf).Fix
Gleiches mit gleichem vergleichen — empfohlen Kombination:
docker buildx imagetools inspect "$img" --rawliefert das Index-JSON; daraus denmanifests[]-Eintrag picken, dessenplatformzur Host-Plattform passt (docker version --format '{{.Server.Os}}/{{.Server.Arch}}'), dessendigestalsrem_archnehmen → gegen lokalenRepoDigests[0]vergleichen..Manifest.Digest) alsrem_indexbehalten und "aktuell" werten, wenn der lokale Digest einem von beiden entspricht:update_available = (cur != rem_arch && cur != rem_index)--raw/jq nicht verfuegbar: bisheriges Verhalten als Fallback, aber Ergebnis alsunknownstatttruewerten (kein False-Positive).Hinweis: im Gast ist nicht zwingend
jqvorhanden — das Index-JSON ggf. im Rust-Code parsen (Agent bekommt--raw-Output zurueck) statt in der Shell.Akzeptanz
:latest(NPM-Testfall): nach Update + Recheck → "aktuell".unknown, nie False-Positive.Bezug
#42 (Digest-Check eingefuehrt), #43 (Relay ueber VM-Guest-Agent), #88-#90 (Daily-Check/Live-Log nutzen dieselbe Logik → profitieren direkt).
Branch
fix/compose-check-multiarch-digestKonkreter Fix (Weg B — arch-Digest gegen arch-Digest)
Bestaetigt @ aktuell:
compose_check(VM-Guest-Agent/src/collect/mod.rs:362-363) vergleichtcur=RepoDigests[0]→ arch-spezifischer Manifest-Digest der lokal gezogenen Plattformrem=imagetools inspect --format {{.Manifest.Digest}}→ bei Multi-Arch-:latestder Index-Digest (Manifest-Liste ueber ALLE Archs)→ die beiden sind per Definition nie gleich →
cur != rem(:380) immer true → dauerhafter False-Positive. Die umgebende Logik (leere Digests →unknown/Null) ist korrekt; nur der Vergleich vergleicht Index gegen Arch.Fix
Remote ebenfalls den arch-spezifischen Digest fuer die lokale Plattform aufloesen, statt des Index:
docker version -f '{{.Server.Os}}/{{.Server.Arch}}'(bzw. os/arch/variant; arm braucht ggf.v7/v8).docker buildx imagetools inspect "$img" --raw(JSON:manifests[]mitplatform.{os,architecture,variant}+digest).digest=rem.cur != remwie bisher.Sicherheitsnetz (kein neuer False-Positive)
manifests[], sondern direkt ein Manifest):--rawliefert keinen Index → dannrem= der direkte Manifest-Digest ({{.Manifest.Digest}}wie bisher ist hier korrekt). Erkennen ammediaType(image.index vs image.manifest) bzw. am Fehlen vonmanifests[].update_available=truesetzen, sondernunknown(Null) — lieber kein Signal als ein falsches.--dry-run-Fallback bleibt fuer "compose/buildx fehlt ganz".Akzeptanz
:latest(z. B. NPM-Container) zeigt kein dauerhaftes "Update verfuegbar" mehr.unknown, kein False-Positive.--dry-run-Fallback.Hinweis
Rust ist im Container nicht baubar → sauber schreiben, Sebastian baut/testet lokal (idealer Test: der NPM-Container, der das Symptom zeigt).
Branch
fix/compose-check-multiarch-digest