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) <noreply@anthropic.com>
This commit is contained in:
2026-06-09 10:59:01 +02:00
parent cfc4866377
commit b273098b50
3 changed files with 27 additions and 13 deletions
+18 -7
View File
@@ -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):