Compose-Datei für Container erstellen, die ohne Compose gestartet wurden

Ich habe über Jahre hinweg Container manuell über die Kommandozeile erstellt, würde aber gerne auf Compose-Dateien umsteigen. Was ist der einfachste Weg, korrekte Compose-YAML-Dateien zu erstellen? Ich habe gehört, dass ich docker inspect <container ID> verwenden und den Output bearbeiten kann, aber dabei entsteht eine sehr lange Datei. Kann ich stattdessen von meinen normalen Kommandozeilen-Befehlen ableiten, wie die Compose-Datei aussehen sollte, und das System übernimmt dann einen Großteil der weiteren Konfigurationen, die im inspect-Output erscheinen?

Ich erstelle alle meine direkt in Container Station, wenn ich die Anwendung einrichte…

Hi @beneix

Du hast Recht, dass die Ausgabe von docker inspect zu umfangreich ist, um sie direkt umzuwandeln — die meisten Informationen darin sind Laufzeitdaten und Bild-Defaults, die gar nicht in eine Compose-Datei gehören. Statt das gesamte JSON zu bearbeiten, empfiehlt es sich, nur die Felder zu extrahieren, die Compose tatsächlich braucht — und zwar mit --format:

C=<container_name>

docker inspect -f '{{.Config.Image}}' $C
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' $C
docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' $C
docker inspect -f '{{range $p,$b := .NetworkSettings.Ports}}{{if $b}}{{(index $b 0).HostPort}}:{{$p}}{{println}}{{end}}{{end}}' $C
docker inspect -f '{{range .Mounts}}{{.Source}}:{{.Destination}}{{if not .RW}}:ro{{end}}{{println}}{{end}}' $C
docker inspect -f '{{range $n,$_ := .NetworkSettings.Networks}}{{println $n}}{{end}}' $C

Diese Ausgaben kannst du direkt den Abschnitten image:, restart:, environment:, ports:, volumes: und networks: einer Compose-Datei zuordnen:

services:
  myapp:
    image: <aus Befehl 1>
    container_name: myapp
    restart: <aus Befehl 2>
    environment:
      - VAR=value        # aus Befehl 3
    ports:
      - "8080:80"        # aus Befehl 4
    volumes:
      - /share/Container/myapp:/config   # aus Befehl 5

Ein paar Tipps, um die Datei übersichtlich zu halten:

  1. Umgebungsvariablen: Befehl 3 listet alle Env-Vars auf, auch die Bild-Defaults (PATH, LANG usw.). Kopiere nur die, die du selbst gesetzt hast. Die Bild-Defaults kannst du dir mit docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' <image> anzeigen und alles rauslassen, was in beiden erscheint.

  2. Command/entrypoint: Füge command: oder entrypoint: nur dann hinzu, wenn du sie beim Container-Erstellen überschrieben hast. Wenn docker inspect einen langen Startbefehl anzeigt, ist das fast immer die Bild-Voreinstellung — lass ihn weg und das Bild regelt das.

  3. Falls das docker CLI über SSH nicht im PATH ist, kannst du es finden mit:

    export PATH="$PATH:$(getcfg container-station Install_Path -f /etc/config/qpkg.conf)/bin"
    
  4. Validier das Ergebnis mit docker compose config, bevor du deployst, und bring es unter neuem Namen hoch — zum Vergleich mit dem ursprünglichen Container, bevor du ihn entfernst.

Da du deine ursprünglichen docker run-Befehle noch hast — das ist eigentlich die beste Quelle. Eine Compose-Datei ist im Grunde eine YAML-Version deiner CLI-Flags (-p → ports, -v → volumes, -e → environment, --restart → restart), das direkte Übersetzen deiner eigenen Befehle ergibt eine viel sauberere Datei, als den laufenden Container rückwärts zu analysieren.

Zukünftig kannst du Apps auch direkt als Compose-Datei in Container Station erstellen (Applications → Create), dort gibt’s einen YAML-Editor mit Validierung — wie NA9D oben gezeigt hat.