diff --git a/README.md b/README.md index 8397c91..c93267b 100644 --- a/README.md +++ b/README.md @@ -113,9 +113,10 @@ uebersprungen – so wird ein Doppel-Upload vermieden, auch wenn der Tag (z. Im selben Tab kann der Inhalt einer `docker-compose.yml` in ein Textfeld eingefuegt oder eine Datei hochgeladen werden. Mit **Alle Images holen** werden alle -`image:`-Eintraege der Services in die Registry kopiert. Eintraege mit nicht -aufgeloesten Variablen (z. B. `${TAG}`) oder die bereits auf diese Registry zeigen, -werden uebersprungen. +`image:`-Eintraege der Services in die Registry kopiert. Variablen mit Standardwert +(z. B. `${GRAYLOG_IMAGE:-graylog/graylog:7.1}`) werden mit ihrem Standardwert +aufgeloest. Eintraege mit Variablen *ohne* Standardwert (z. B. `${TAG}`) oder die +bereits auf diese Registry zeigen, werden uebersprungen. ## Images loeschen und Speicher aufraeumen (Web-Oberflaeche) diff --git a/auth-app/app.py b/auth-app/app.py index 5621d3f..92a81a2 100644 --- a/auth-app/app.py +++ b/auth-app/app.py @@ -126,12 +126,22 @@ def split_dest(dest): return repo, tag +# Loest ${VAR:-default} und ${VAR-default} zum Default-Wert auf. +# ${VAR}, ${VAR:?...} usw. (ohne Default) werden NICHT aufgeloest. +_VAR_DEFAULT_RE = re.compile(r"\$\{[A-Za-z_][A-Za-z0-9_]*:?-([^}]*)\}") + + +def resolve_compose_image(image): + """Ersetzt Compose-Variablen mit Default (${VAR:-default}) durch den Default.""" + return _VAR_DEFAULT_RE.sub(lambda m: m.group(1), image) + + def extract_compose_images(content): """Liest alle 'image:'-Eintraege aus den Services einer docker-compose. Gibt (images, ignored) zurueck. images ist None bei ungueltigem YAML. - Eintraege mit Variablen (${...}) oder auf die eigene Registry werden - uebersprungen und in ignored gesammelt. + Variablen mit Default (${VAR:-wert}) werden aufgeloest. Eintraege mit + nicht aufloesbaren Variablen oder auf die eigene Registry landen in ignored. """ try: data = yaml.safe_load(content) @@ -147,13 +157,14 @@ def extract_compose_images(content): for svc in services.values(): if not isinstance(svc, dict): continue - image = svc.get("image") - if not isinstance(image, str) or not image.strip(): + raw = svc.get("image") + if not isinstance(raw, str) or not raw.strip(): continue - image = image.strip() + raw = raw.strip() + image = resolve_compose_image(raw) host = image.split("/", 1)[0] if "/" in image else "" - if "$" in image or "{" in image: - ignored.append(image) # nicht aufgeloeste Variable + if not image or "$" in image or "{" in image or "}" in image: + ignored.append(raw) # Variable ohne Default - nicht aufloesbar elif host and host in (REGISTRY_HOST, request.host): ignored.append(image) # zeigt bereits auf unsere Registry elif not _IMAGE_REF_RE.match(image): diff --git a/auth-app/templates/images.html b/auth-app/templates/images.html index 535aa0a..07e382c 100644 --- a/auth-app/templates/images.html +++ b/auth-app/templates/images.html @@ -121,9 +121,11 @@ image:-Eintrag gelesen und das Image in diese Registry kopiert.

- Eintraege mit nicht aufgeloesten Variablen (z. B. ${TAG}) oder die bereits - auf diese Registry zeigen, werden uebersprungen. Bereits vorhandene Images (gleicher - Digest) werden ebenfalls nicht erneut geladen. + Variablen mit Standardwert (z. B. ${GRAYLOG_IMAGE:-graylog/graylog:7.1}) + werden automatisch mit ihrem Standardwert aufgeloest. Eintraege mit Variablen + ohne Standardwert (z. B. ${TAG}) oder die bereits auf diese + Registry zeigen, werden uebersprungen. Bereits vorhandene Images (gleicher Digest) + werden ebenfalls nicht erneut geladen.

Etwaige Zugangsdaten gelten fuer alle Images der Compose-Datei.