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?
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:
-
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. -
Command/entrypoint: Füge
command:oderentrypoint:nur dann hinzu, wenn du sie beim Container-Erstellen überschrieben hast. Wenndocker inspecteinen langen Startbefehl anzeigt, ist das fast immer die Bild-Voreinstellung — lass ihn weg und das Bild regelt das. -
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" -
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.
