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:
@@ -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
|
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
|
oder eine Datei hochgeladen werden. Mit **Alle Images holen** werden alle
|
||||||
`image:`-Eintraege der Services in die Registry kopiert. Eintraege mit nicht
|
`image:`-Eintraege der Services in die Registry kopiert. Variablen mit Standardwert
|
||||||
aufgeloesten Variablen (z. B. `${TAG}`) oder die bereits auf diese Registry zeigen,
|
(z. B. `${GRAYLOG_IMAGE:-graylog/graylog:7.1}`) werden mit ihrem Standardwert
|
||||||
werden uebersprungen.
|
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)
|
## Images loeschen und Speicher aufraeumen (Web-Oberflaeche)
|
||||||
|
|
||||||
|
|||||||
+18
-7
@@ -126,12 +126,22 @@ def split_dest(dest):
|
|||||||
return repo, tag
|
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):
|
def extract_compose_images(content):
|
||||||
"""Liest alle 'image:'-Eintraege aus den Services einer docker-compose.
|
"""Liest alle 'image:'-Eintraege aus den Services einer docker-compose.
|
||||||
|
|
||||||
Gibt (images, ignored) zurueck. images ist None bei ungueltigem YAML.
|
Gibt (images, ignored) zurueck. images ist None bei ungueltigem YAML.
|
||||||
Eintraege mit Variablen (${...}) oder auf die eigene Registry werden
|
Variablen mit Default (${VAR:-wert}) werden aufgeloest. Eintraege mit
|
||||||
uebersprungen und in ignored gesammelt.
|
nicht aufloesbaren Variablen oder auf die eigene Registry landen in ignored.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
data = yaml.safe_load(content)
|
data = yaml.safe_load(content)
|
||||||
@@ -147,13 +157,14 @@ def extract_compose_images(content):
|
|||||||
for svc in services.values():
|
for svc in services.values():
|
||||||
if not isinstance(svc, dict):
|
if not isinstance(svc, dict):
|
||||||
continue
|
continue
|
||||||
image = svc.get("image")
|
raw = svc.get("image")
|
||||||
if not isinstance(image, str) or not image.strip():
|
if not isinstance(raw, str) or not raw.strip():
|
||||||
continue
|
continue
|
||||||
image = image.strip()
|
raw = raw.strip()
|
||||||
|
image = resolve_compose_image(raw)
|
||||||
host = image.split("/", 1)[0] if "/" in image else ""
|
host = image.split("/", 1)[0] if "/" in image else ""
|
||||||
if "$" in image or "{" in image:
|
if not image or "$" in image or "{" in image or "}" in image:
|
||||||
ignored.append(image) # nicht aufgeloeste Variable
|
ignored.append(raw) # Variable ohne Default - nicht aufloesbar
|
||||||
elif host and host in (REGISTRY_HOST, request.host):
|
elif host and host in (REGISTRY_HOST, request.host):
|
||||||
ignored.append(image) # zeigt bereits auf unsere Registry
|
ignored.append(image) # zeigt bereits auf unsere Registry
|
||||||
elif not _IMAGE_REF_RE.match(image):
|
elif not _IMAGE_REF_RE.match(image):
|
||||||
|
|||||||
@@ -121,9 +121,11 @@
|
|||||||
<code>image:</code>-Eintrag gelesen und das Image in diese Registry kopiert.
|
<code>image:</code>-Eintrag gelesen und das Image in diese Registry kopiert.
|
||||||
</p>
|
</p>
|
||||||
<p class="help-step">
|
<p class="help-step">
|
||||||
Eintraege mit nicht aufgeloesten Variablen (z. B. <code>${TAG}</code>) oder die bereits
|
Variablen mit Standardwert (z. B. <code>${GRAYLOG_IMAGE:-graylog/graylog:7.1}</code>)
|
||||||
auf diese Registry zeigen, werden uebersprungen. Bereits vorhandene Images (gleicher
|
werden automatisch mit ihrem Standardwert aufgeloest. Eintraege mit Variablen
|
||||||
Digest) werden ebenfalls nicht erneut geladen.
|
<em>ohne</em> Standardwert (z. B. <code>${TAG}</code>) oder die bereits auf diese
|
||||||
|
Registry zeigen, werden uebersprungen. Bereits vorhandene Images (gleicher Digest)
|
||||||
|
werden ebenfalls nicht erneut geladen.
|
||||||
</p>
|
</p>
|
||||||
<p class="help-step">
|
<p class="help-step">
|
||||||
Etwaige Zugangsdaten gelten fuer <em>alle</em> Images der Compose-Datei.
|
Etwaige Zugangsdaten gelten fuer <em>alle</em> Images der Compose-Datei.
|
||||||
|
|||||||
Reference in New Issue
Block a user