Docker Run zu Compose

Füge einen docker run Befehl ein und erhalte eine sofort einsatzbereite Compose-Service-Definition: Ports, Volumes, Umgebung, Netzwerke, Healthcheck und Neustart-Richtlinie, konvertiert in deinem Browser.

Verwandle einen langen docker run Befehl in eine Compose-Datei, die du committen kannst. Füge den Befehl genau so ein, wie du ihn tippen würdest, einschließlich Zeilenfortsetzungen. Flags ohne Compose-Äquivalent werden als Hinweise aufgeführt, statt sie stillschweigend zu verwerfen.

Von einem Ad-hoc-Befehl zu einer reproduzierbaren Datei

Warum die Übersetzung nicht rein mechanisch ist

Ein docker run Befehl und ein Compose-Service beschreiben den gleichen Container, beantworten aber unterschiedliche Fragen. Der Befehl sagt, was jetzt zu tun ist. Die Datei sagt, was immer gelten soll, wenn dieser Service läuft. Die meisten Flags lassen sich sauber übertragen, und die, die es nicht tun, sind fast immer diejenigen, die den Akt des Ausführens statt des Containers selbst beschreiben.

Das klarste Beispiel ist detach. -d weist den Daemon an, dein Terminal nicht zu blockieren – das ist eine Eigenschaft dieses Aufrufs, nicht des Service. In Compose wird dieselbe Absicht in der Befehlszeile mit docker compose up -d ausgedrückt, daher verschwindet das Flag einfach aus der Datei. Das Gleiche gilt für --rm, das nach diesem einen Lauf um Aufräumen bittet; das Compose-Äquivalent ist docker compose down, wenn du fertig bist.

Interaktive Flags liegen dazwischen. Sowohl -i als auch -t haben Compose-Schlüssel, stdin_open und tty, weil das Halten einer Shell eine echte Eigenschaft eines Service sein kann. Sie werden konvertiert statt verworfen, auch wenn die meisten langlebigen Services sie nicht brauchen.

Anführungszeichen sind der Punkt, an dem Konvertierungen scheitern

Die mit Abstand häufigste Ursache für eine fehlerhafte Konvertierung ist ein Shell-Anführungszeichen, das verloren ging, bevor der Befehl eingefügt wurde. Betrachte einen Healthcheck: Der gesamte Testbefehl muss als ein einziges Argument ankommen, weshalb er in der Befehlszeile in Anführungszeichen gesetzt wird. Fügst du ihn ohne Anführungszeichen ein, werden die Wörter zu separaten Argumenten, der Image-Name wird an der falschen Position gelesen, und das Ergebnis ist Unsinn.

Der Konverter zerlegt die Eingabe so, wie es eine Shell täte, unter Beachtung von einfachen Anführungszeichen, doppelten Anführungszeichen, Backslash-Escapes und Backslash-Zeilenfortsetzungen, sodass ein direkt aus einem Skript kopierter Befehl seine Struktur behält. Beim Ausgeben werden die Werte dann gemäß den YAML-Regeln erneut in Anführungszeichen gesetzt, was mehr zählt, als viele erwarten. Eine Port-Zuordnung wie 8080:80 muss in YAML in Anführungszeichen gesetzt werden, weil ein unverpacktes, durch Doppelpunkt getrenntes Paar mehrdeutig ist und ältere Parser Werte wie 22:00 historisch als sexagesimale Zahl lasen.

Netzwerke und was die Datei nicht wissen kann

Die Netzwerkbehandlung ist der eine Bereich, in dem eine getreue Konvertierung dennoch eine Entscheidung von dir braucht. Wenn der Befehl host, none oder bridge beitritt, ist das ein Modus und wird zu network_mode. Jeder andere Name bezieht sich auf ein bereits existierendes Netzwerk, sodass der Service einen networks-Eintrag erhält und die Datei dieses Netzwerk als extern deklariert.

Diese Deklaration ist eine Aussage über deine Umgebung: Sie besagt, dass das Netzwerk außerhalb dieser Datei verwaltet wird. Wenn du möchtest, dass Compose das Netzwerk selbst erstellt und besitzt, entferne das external-Flag und lass es normal definieren. Der Konverter kann nicht erkennen, was du willst, weil der ursprüngliche Befehl nur beweist, dass das Netzwerk zum Zeitpunkt seiner Ausführung existierte.

Dieselbe Vorsicht gilt für Bind-Mounts. Ein Pfad wie /srv/site funktioniert auf dem Rechner, auf dem der Befehl geschrieben wurde, und nirgendwo sonst. Sobald der Service in einer Datei lebt, die committet und geteilt wird, sind relative Pfade oder benannte Volumes meist die bessere Wahl.

Intern gebaut mit einem handgeschriebenen Shell-Tokenisierer und YAML-Schreiber. Es ist kein Fremd-Parser gebündelt, und dein Befehl verlässt den Browser nie.

Häufig gestellte Fragen

Warum ist das -d-Flag aus der Ausgabe verschwunden?
Detach beschreibt, wie du einen Container startest, nicht was der Container ist. In Compose drückst du dasselbe aus, indem du docker compose up -d ausführst, daher gehört es nicht in die Datei.
Kann ich einen mehrzeiligen Befehl mit Backslashes einfügen?
Ja. Backslash-Zeilenfortsetzungen werden vor dem Parsen zusammengefügt, sodass du einen Befehl direkt aus einem Shell-Skript oder einer Dokumentation kopieren kannst, ohne ihn umzuformatieren.
Warum sind meine Ports in Anführungszeichen gesetzt?
YAML behandelt ein unverpacktes, durch Doppelpunkt getrenntes Paar als mehrdeutig, und manche Parser lesen Werte wie 22:00 als Zahl. Port-Zuordnungen in Anführungszeichen zu setzen, ist der dokumentierte Weg, sie exakt zu halten.
Was bedeutet external: true im erzeugten Netzwerk?
Es teilt Compose mit, dass das Netzwerk bereits existiert und von dieser Datei nicht erstellt oder entfernt werden soll. Wenn Compose das Netzwerk selbst verwalten soll, entferne dieses Flag.
Werden nicht unterstützte Flags stillschweigend ignoriert?
Nein. Alles, was der Konverter nicht abbilden kann, wird unter Konvertierungshinweisen aufgeführt, sodass du entscheiden kannst, was du damit machst, statt die Auslassung später zu entdecken.
Wird mein Befehl irgendwo hochgeladen?
Nein. Das Parsen und die YAML-Erzeugung laufen beide im Browser mit handgeschriebenem Code, sodass der Befehl die Seite nie verlässt.