Docker Run zu Docker Compose umwandeln (und zurück)

Mach aus einem docker-run-Befehl einen Service in einer docker-compose.yml – oder aus einem Compose-Service wieder docker run.

Beispiele:
Mehrzeilige Befehle mit \-Fortsetzungen, Anführungszeichen und --flag=wert-Schreibweisen sind kein Problem.
docker-compose.yml
services:
  db:
    image: postgres:16
    container_name: db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: change-me
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "127.0.0.1:5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
volumes:
  pgdata:
    name: pgdata
Hinweise
  • -d / --detach entfernt: Nutze „docker compose up -d“, um im Hintergrund zu starten.
  • Benannte Volumes behalten ihren exakten Namen („name:“), damit Compose das von docker run angelegte Volume wiederverwendet, statt ein neues, leeres „<project>_<volume>“ zu erstellen.

Läuft komplett in deinem Browser. Befehle und Compose-Dateien, samt darin enthaltener Passwörter, werden nirgendwohin gesendet. Alle kostenlosen Tools ansehen.

Ein Problem gefunden oder etwas, das besser sein könnte? Wir lesen jede Nachricht und beheben Fehler schnell.

Dieser Konverter von docker run zu Docker Compose macht aus einem docker-run-Befehl – der Art, die du aus der README eines Projekts kopierst – einen Service in einer docker-compose.yml: Ports, Volumes, Umgebungsvariablen, Netzwerke, Restart-Policy, Healthcheck, Capabilities, Devices, GPU-Zugriff und Dutzende weitere Optionen. Er funktioniert auch umgekehrt und macht aus jedem Service in einer Compose-Datei den entsprechenden docker-run-Befehl, für einen schnellen Test oder ein System ohne Compose.

Die Umwandlung achtet auf die Details, an denen echte Deployments scheitern. Ports werden in Anführungszeichen gesetzt, weil YAML 1.1 ein 22:22 ohne Anführungszeichen als Zahl zur Basis 60 liest. Benannte Volumes behalten ihren exakten Namen, sodass Compose die Daten weiterverwendet, die docker run angelegt hat, statt mit einem leeren „<project>_<volume>“ anzufangen. $(pwd) wird zu einem relativen Pfad. Flags, die nur die CLI-Sitzung betreffen, wie -d und --rm, werden mit Hinweis weggelassen, und alles ohne Compose-Entsprechung wird als Warnung aufgeführt, statt stillschweigend verloren zu gehen.

So funktioniert’s

  1. Füge einen docker-run-Befehl in das linke Feld ein oder klicke auf ein Beispiel. Mehrzeilige Befehle mit Backslashes sind kein Problem.
  2. Lies die erzeugte docker-compose.yml rechts und prüfe die Hinweise und Warnungen darunter.
  3. Kopiere das YAML oder lade es als docker-compose.yml herunter, leg es in dein Projektverzeichnis und führe docker compose up -d aus.
  4. Für die andere Richtung wechselst du zu „Compose → docker run“, fügst eine Compose-Datei ein und kopierst den Befehl für jeden Service.

Häufige Fragen

Was ist der Unterschied zwischen docker run und docker compose?

docker run startet einen Container mit Optionen von der Kommandozeile. Docker Compose beschreibt einen oder mehrere Container, ihre Netzwerke und Volumes in einer YAML-Datei und startet sie gemeinsam mit docker compose up. Compose lässt sich leichter versionieren, prüfen und identisch erneut ausführen, und Services im selben Compose-Projekt erreichen einander über den Servicenamen.

Brauche ich in der docker-compose.yml noch die Zeile version:?

Nein. Der Top-Level-Schlüssel version ist unter der Compose Specification, die Docker Compose v2 verwendet, überholt, und aktuelle Versionen geben eine Warnung aus, dass er ignoriert wird. Dieser Konverter lässt ihn weg. Die Dateien heißen heute meist compose.yaml, docker-compose.yml wird aber weiterhin gelesen.

Warum fehlen nach dem Wechsel zu Compose die Daten meines Volumes?

Compose stellt benannten Volumes den Projektnamen voran, ein Volume namens pgdata wird also zu myproject_pgdata – einem neuen, leeren Volume. Um das von docker run angelegte Volume weiterzuverwenden, deklariere es auf oberster Ebene mit name: pgdata (das macht dieser Konverter) oder markiere es als external: true. Bind Mounts (Pfade, die mit / oder ./ beginnen) sind nicht betroffen.

Was passiert mit -d, -it und --rm?

-d betrifft die Art, wie du die Container startest, nutze also docker compose up -d. -i und -t werden zu stdin_open: true und tty: true. --rm hat keine Entsprechung pro Service: docker compose down entfernt die Container, und für einmalige Befehle gibt es docker compose run --rm.

Wie werden GPU-Optionen umgewandelt?

--gpus all wird zu einer Geräte-Reservierung unter deploy.resources.reservations.devices mit driver: nvidia, count: all und capabilities: [gpu] – die Form, die für Docker Compose dokumentiert ist. Bestimmte GPUs (--gpus '"device=0,1"') werden zu device_ids. Auf dem Host muss trotzdem das NVIDIA Container Toolkit installiert sein.

Wird mein Befehl an einen Server gesendet?

Nein. Parsen und Umwandeln passieren in deinem Browser, Umgebungsvariablen, Passwörter und interne Hostnamen im Befehl verlassen also nie deinen Rechner. Behandle eine Compose-Datei mit Geheimnissen trotzdem wie eine Passwortdatei: Verschiebe sie in eine env_file, die in der .gitignore steht.

docker-run-Flags und ihre Compose-Schlüssel

• -p 8080:80 → ports: ["8080:80"] · --expose → expose

• -v /host:/ctr oder -v name:/ctr → volumes · --mount → volumes in Langform · --tmpfs → tmpfs

• -e KEY=value → environment · --env-file → env_file · -l / --label → labels

• --name → container_name · -h → hostname · -u → user · -w → working_dir

• --restart → restart · --network → networks oder network_mode (host, none, container:…) · --network-alias, --ip → Aliasse und ipv4_address pro Netzwerk

• --entrypoint → entrypoint · Argumente nach dem Image → command

• --health-cmd/-interval/-timeout/-retries/-start-period → healthcheck · --no-healthcheck → healthcheck.disable

• --cap-add/--cap-drop → cap_add/cap_drop · --device → devices · --privileged, --read-only, --init → gleiche Namen

• -m / --memory → mem_limit · --cpus → cpus · --shm-size → shm_size · --ulimit → ulimits · --sysctl → sysctls

• --log-driver/--log-opt → logging · --add-host → extra_hosts · --dns → dns · --gpus → deploy.resources.reservations.devices

Nach der Umwandlung: ein echtes Compose-Projekt daraus machen

Eine Eins-zu-eins-Umwandlung ist ein Ausgangspunkt. Sobald mehrere Container in einer Datei leben, ersetze --link und fest eingetragene Container-IPs durch Servicenamen (die App erreicht die Datenbank unter db:5432), füge depends_on mit condition: service_healthy hinzu, damit die App auf den Healthcheck der Datenbank wartet, und lass container_name weg, sofern nicht etwas außerhalb von Compose einen festen Namen braucht – denn er verhindert das Skalieren eines Service. Verschiebe Passwörter aus environment in eine .env-Datei oder Compose-Secrets und halte diese Datei aus Git heraus.

Ähnliche kostenlose Tools

  • Subnetzrechner — Netzwerk-, Broadcast-Adresse, Hostbereich und Maske für jeden CIDR; Netze per VLSM aufteilen, IPv6 ausschreiben und überlappende Bereiche finden.
  • Chmod-Rechner — Setze Häkchen für Lesen, Schreiben und Ausführen und erhalte den Oktalmodus und den chmod-Befehl – oder entschlüssle 755, 644 und rwxr-xr-x.
  • .gitignore-Generator — Kombiniere .gitignore-Vorlagen für Sprachen, Frameworks, Editoren und Betriebssysteme zu einer sauberen Datei.
  • JSON Formatter — JSON formatieren, minifizieren und validieren, Parse-Fehler mit Zeile und Spalte. Im Browser, ohne Upload.
  • Cron-Generator — Erstelle einen Cron-Zeitplan per Dropdown oder füge einen ein, lies ihn in Klartext und sieh die nächsten 10 Ausführungen in deiner Zeitzone und in UTC. Kostenlos, im Browser.