Zwei Probleme nach dem alten --delete-untagged-Schaden:
1) Repos mit Tags aber ohne _layers (verwaist) tauchen nicht im
Registry-Katalog auf -> waren in der Web-Oberflaeche unsichtbar und
nicht loeschbar. images() listet jetzt zusaetzlich direkt aus dem
Dateisystem (scan_fs_repositories/repo_tags), Vereinigung mit dem
Katalog. So sind auch korrupte Repos sichtbar und ueber den
Loeschen-Button entfernbar.
2) Die GC laeuft als separater Prozess auf dem gemounteten Speicher.
Der In-Memory-Blob-Cache der laufenden Registry hielt geloeschte
Blobs faelschlich fuer vorhanden -> erneuter Pull legte keine
_layers-Verknuepfung an (Image fehlte im Katalog). Cache via
REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR="" deaktiviert -> Live-GC sicher.
Verifiziert: korruptes Repo -> in Liste sichtbar -> Loeschen -> GC ->
erneut pushen -> Katalog korrekt und docker pull erfolgreich, ohne
Registry-Neustart.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
registry garbage-collect --delete-untagged loescht bei Multi-Arch-Images
die per-Architektur-Manifeste, die nur ueber die Manifest-Liste (Index)
referenziert sind. Die Liste/der Tag bleibt, die Kind-Manifeste sind weg
-> beim Pull "manifest unknown".
Reproduziert: zwei Multi-Arch-Images, garbage-collect --delete-untagged
markiert die Kind-Manifeste als "eligible for deletion" und loescht sie;
danach schlaegt "skopeo copy --all" mit manifest unknown fehl. Ohne das
Flag bleiben die Images intakt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ein Tag konnte im Katalog stehen, dessen Manifest aber nicht mehr
abrufbar war (Rest aus frueherem Loeschen/GC). Der Loeschen-Button
schlug dann mit "Tag nicht gefunden" fehl, der Eintrag liess sich nicht
entfernen.
delete_image entfernt jetzt zusaetzlich den Tag-Verweis direkt aus dem
Speicher: faellt der Manifest-Lookup ueber die API aus, wird der
verwaiste Tag trotzdem entfernt (und bei letztem Tag das Repository).
Pfad-Sicherheit in _safe_repo_path() gebuendelt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Die Registry-API loescht nur Manifeste/Tags, das Repository-Verzeichnis
bleibt im Speicher und damit im Katalog ("keine Tags") stehen. Da der
Auth-Container den Registry-Speicher gemountet hat, wird das leere
Verzeichnis jetzt entfernt:
- beim Loeschen des letzten Tags direkt
- bei der Garbage Collection werden zusaetzlich alle Tag-losen
Repositories aufgeraeumt (fuer bereits vorhandene Reste)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Viele docker-compose-Dateien (z. B. Graylog) setzen Images per
${IMAGE:-default}. Bisher wurde alles mit "$" uebersprungen, sodass genau
diese Images nicht gefunden wurden. Jetzt werden ${VAR:-default} und
${VAR-default} mit ihrem Standardwert aufgeloest; nur Variablen ohne
Default (${VAR}, ${VAR:?...}) bleiben uebersprungen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Tab "Images" um Verwaltungsfunktionen erweitert:
- Einzel-Pull: Image aus anderer Registry (z. B. Docker Hub) per skopeo
in die eigene Registry kopieren, optional mit Benutzername/Kennwort
oder Access Token fuer private Quell-Registries
- Bulk-Pull: alle image-Eintraege einer docker-compose (Textfeld oder
Datei-Upload) auf einmal holen; Variablen/eigene Registry werden ignoriert
- Digest-Dedup: bereits mit gleichem Digest vorhandene Images werden
uebersprungen (kopiert mit --all, damit Multi-Arch-Digests matchen)
- Loeschen: Muelltonne hinter jedem Tag mit Rueckfrage
- Garbage Collection: gibt belegten Speicher frei, laeuft per registry-Binary
(Multi-Stage-Build) direkt auf dem gemounteten Speicher, kein Docker-Socket
gunicorn: 1 Worker (gemeinsames Service-Passwort) + 8 Threads, Timeout 1800s
fuer lange Kopiervorgaenge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>