Docker/Podman Composer — Tipps & Tricks
Grenzen des Konverters, Round-Trip-Verluste, welche Flags wegfallen und wie du den Composer mit Cheat-Sheets und anderen JPKCom-Tools kombinierst.
Zurück zur Übersicht: Docker/Podman Composer · Tool live öffnen: www.jpkc.com/tools/docker/
Das Manual listet jedes Flag, die Beispiele zeigen die Durchläufe. Hier geht es um das, was beides voraussetzt: wo der Konverter bewusst Grenzen hat, was bei einem Hin-und-Zurück verloren geht und wie du das Tool sinnvoll einsetzt.
Was der Konverter NICHT abbildet
Der Composer ist ein Text-zu-Text-Übersetzer. Einige Dinge fallen dabei systembedingt weg — kein Bug, sondern die Natur der beiden Formate. Wichtig: Das meiste, was es weglässt, meldet das Tool in der Hinweisliste unter der Ausgabe — aber nicht alles. Unterschlüssel bekannter Compose-Keys wie build.cache_from oder deploy.placement und die network create-Optionen --scope, --aux-address und --ipv4 fallen ohne Hinweis weg (Details im Manual). Lies die Liste, bevor du das Ergebnis übernimmst, und vergleich bei komplexen Dateien Ein- und Ausgabe.
--rmhat keine Compose-Entsprechung — Compose behält gestoppte Container. Für Einmal-Läufe nimmst dudocker compose run --rm.-d/--detachentfällt still, weil es in Compose implizit ist; bei Compose → Run wird umgekehrt immer ein-dgesetzt.-P/--publish-allund Optionen wie--cidfile,--kernel-memory,--volume-driveroder die Podman-Optionen--podund--systemdhaben keinen Compose-Key und werden mit Hinweis verworfen.- Unbekannte Flags werden übersprungen und gemeldet. Erwartet so ein Flag einen Wert, kann das Tool diesen Wert für das Image halten — der Hinweis sagt dir dann, welches Wort betroffen ist. Schreib solche Flags in der Form
--flag=wert, dann ist die Zuordnung eindeutig. - Pipes, Umleitungen und Kommandosubstitution (
| tee log,> out,$(pwd)) gehören zur Shell, nicht zum Container. Der Rest der Zeile nach|oder>fällt weg,$(…)bleibt als Text stehen.
Compose-only: was du nach der Umwandlung von Hand ergänzt
Manche Compose-Konstrukte lassen sich aus einem run-Befehl nicht ableiten — und gehen umgekehrt bei Compose → Run ganz oder teilweise verloren. Der Reference-Tab führt sie als „Compose-only Features":
depends_on— bei Run → Compose ergänzt du es von Hand. In der Gegenrichtung ordnet das Tool die Befehle danach, prüft aber keine Bedingungen wieservice_healthy.build— bei Run → Compose ergänzt du es von Hand. In der Gegenrichtung entsteht daraus eindocker build -t …vor demrun.profiles,deploy.replicasundscale— bei Compose → Run mit Hinweis ignoriert; jedesrunstartet genau einen Container.secrets/configs— Varianten mitfile:werden bei Compose → Run zu schreibgeschützten Mounts, Secrets unter/run/secrets/<ziel>, Configs unter/<ziel>(ein absolutestargetgilt unverändert); solche ausenvironment:, mitcontent:oder aus Swarm nicht.
Top-Level-Netze und -Volumes musst du nicht mehr selbst schreiben: Das Tool deklariert sie bei Run → Compose (als external: true oder, wenn docker network create/docker volume create mit in der Eingabe steht, mit exaktem name:) und legt sie bei Compose → Run im Skript an.
Der praktische Kniff: Die YAML-Ausgabe im Run-Tab ist editierbar (Badge „editable"). Konvertiere zuerst deine Run-Befehle und tippe danach direkt im Tool ein depends_on oder einen build:-Block hinzu, bevor du die Datei kopierst oder als compose.yaml herunterlädst. Aber Vorsicht: Änderst du danach die Eingabe oder den Projektnamen, rechnet das Tool neu und überschreibt deine Ergänzungen.
Round-Trip ist nicht verlustfrei
Wenn du einen Befehl nach Compose und dann wieder zurück nach run konvertierst, bekommst du nicht zwingend exakt deine Eingabe:
- Verworfene Flags kommen nicht wieder.
--rm,-Pund unbekannte Flags sind nach dem ersten Schritt weg. -dwird neu gesetzt. Compose → Run stellt jedem Befehl ein-dvoran, auch wenn das Original keines hatte.- Das Netz ändert sich. Ein
docker runohne--networkläuft im Default-Bridge-Netz. Auf dem Rückweg landet der Container wie bei Compose im Netz<projekt>_defaultund bekommt seinen Service-Namen als--network-alias. Ohne--nameheißt er<projekt>-<service>-1. - Healthcheck-Form wandelt sich.
--health-cmd "…"wird zutest: [CMD-SHELL, …]. Liest du eine Compose-Datei mit["CMD", …]ein, setzt das Tool die Wörter einzeln gequotet zu einem--health-cmdzusammen und weist darauf hin, dassdocker runnur die Shell-Form kennt — das Image braucht dafür/bin/sh. - Reihenfolge und Quoting ändern sich. Flags erscheinen in fester Reihenfolge, jedes auf einer eigenen Zeile. In YAML stehen Ports und Zahlen-Strings in Anführungszeichen (
"8080:80","3600"), im Skript wörtliche Werte in einfachen Anführungszeichen. Das ist semantisch identisch, sieht aber anders aus als deine Vorlage.
Fazit: Nutze den Composer als Startpunkt und Gerüst, nicht als bit-genauen Round-Trip. Prüf das Ergebnis einmal gegen, bevor es in Produktion geht.
Kleine Kniffe
- Mehrere Befehle auf einmal. Kopier ein ganzes Setup-Snippet aus einer Anleitung in das Eingabefeld — inklusive
docker network createunddocker volume create. Jederrunwird zum Service, die Netze und Volumes landen sauber deklariert in derselben Datei.sudo, Kommentare und Befehle wiedocker psstören nicht. - Lange Befehle mit Backslash umbrechen. Der Tokenizer versteht
\-Zeilenfortsetzungen und Shell-Quoting, du kannst also einen kopierten, mehrzeiligen Befehl unverändert einfügen.--flag=value,--flag valueund Bündel wie-dp 80:80funktionieren alle. - Projektnamen setzen. Trag im Feld Compose project name den Namen ein, unter dem du
docker composespäter startest (sonst nimmt Compose den Ordnernamen). Dann stimmen im Skript die Netz-, Volume- und Containernamen mit dem überein, was Compose anlegen würde — wichtig, wenn du Compose und von Hand gestartete Container mischst. - Ergebnis prüfen.
docker compose configmeldet undefinierte Netze und Volumes und zeigt die Datei so, wie Compose sie versteht. Das erzeugte Skript kannst du mitsh -n run.shauf Syntaxfehler prüfen, bevor du es ausführst. run.shstatt Copy. Der Download bringt#!/bin/shundset -emit — das Skript bricht beim ersten Fehler ab, statt mit dem nächsten Container weiterzumachen. Netze legt es nur an, wenn sie noch fehlen (network inspect … || network create …), ein vorhandenes Netz bricht den Lauf also nicht ab.- Variablen exportieren. Bleibt
${VAR}im Skript stehen, setzt die Shell den Wert ein — Compose hätte ihn auch aus.envgelesen. Exportiere die Variablen vorher, etwa mitset -a; . ./.env; set +a. - Datenschutz inklusive. Weil alles clientseitig läuft und nichts gesendet wird, kannst du Befehle mit Passwörtern, Tokens oder internen Hostnamen bedenkenlos konvertieren. Gespeichert werden nur Projektname und Runtime-Wahl. Trotzdem gilt: Solche Werte gehören in der echten Compose-Datei in eine
.env-Datei oder insecrets, nicht im Klartext ins Repository. - Compose-Snippet ohne
services:-Wrapper geht auch. Der Parser akzeptiert in der Gegenrichtung auch eine blanke Services-Map, solange jeder Serviceimageoderbuildhat.
Mit anderen JPKCom-Tools kombinieren
- Run-Befehl von Hand bauen oder verstehen? Das Docker-Cheat-Sheet erklärt den Container-Lebenszyklus und die wichtigsten
docker-Flags — gutes Nachschlagewerk, bevor du einen Befehl in den Composer wirfst. - Mit der erzeugten YAML weiterarbeiten? Das Docker-Compose-Cheat-Sheet zeigt, wie du die Datei mit
docker compose up,down,logs& Co. betreibst — und welche Felder (depends_on,build…) du noch ergänzen kannst. - Auf Podman umsteigen? Das Podman-Cheat-Sheet ordnet die
podman-Befehle ein, die das Tool im Podman-Modus erzeugt. - Container-Job zeitsteuern? Mit dem Cron-Generator baust du die passende Crontab-Zeile, etwa für einen regelmäßigen
docker run-Wartungsjob.
Noch mehr Kontext: die Übersicht zum großen Bild, das Manual für jedes Flag und die Beispiele für die Schritt-für-Schritt-Abläufe. Ausprobieren kannst du alles direkt im Tool.