From b273098b502c09dd2fed5be60bf5ff9eda889793 Mon Sep 17 00:00:00 2001
From: duffyduck
Date: Tue, 9 Jun 2026 10:59:01 +0200
Subject: [PATCH] Compose: Variablen mit Default aufloesen (${VAR:-default})
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)
---
README.md | 7 ++++---
auth-app/app.py | 25 ++++++++++++++++++-------
auth-app/templates/images.html | 8 +++++---
3 files changed, 27 insertions(+), 13 deletions(-)
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.