Ich versuche, einen Docker-Container von einem Computer zu nehmen und auf einem anderen auszuführen, und stoße auf diesen Fehler: "Fehlerantwort vom Daemon: Kein Befehl angegeben".
Unten sehen Sie ein vereinfachtes Beispiel, das das Problem zeigt:
docker --versionDocker version 1.10.1, build 9e83765docker pull ubuntudocker run --name u1 -dit ubuntu:latestdocker export -o exported u1docker stop u1docker rm u1docker import exported ubuntu:importeddocker run --name u1 -dit ubuntu:importeddocker: Error response from daemon: No command specified.
In diesem Beispiel ziehen wir zuerst ein Image (Ubuntu) und erstellen / führen erfolgreich einen Container aus u1 daraus. Dann exportieren wir diesen Container in eine Datei (exported), stoppen/Entfernen des Containers, Importieren der Datei in ein neues Image (ubuntu:imported) und versuchen, einen neuen Container daraus auszuführen. Es scheitert.
docker export exportiert nicht alles über den Container - nur das Dateisystem. Wenn Sie den Dump also wieder in ein neues Docker-Image importieren, müssen zusätzliche Flags angegeben werden, um den Kontext neu zu erstellen.
Zum Beispiel, wenn der ursprüngliche Container einwandfrei lief, weil die Docker-Datei, die zum Erstellen des Images verwendet wurde, Folgendes hatte CMD ["/usr/bin/supervisord"] importieren Sie dann Ihren Dump auf diese Weise:
Wir konnten jedoch den Befehl zum Ausführen nicht finden. Die Lösung bestand darin, alle Container auf dem exportierenden Computer aufzulisten und den Befehl ran zu betrachten.
docker ps
Von dort aus konnten wir herausfinden, wie man den richtigen Befehl ausführt:
docker run --name msSQL -p 1401:1433 -d mssql:latest /opt/mssql/bin/sqlservr
Wenn Sie einen Container exportieren, hat er einen eigenen Verlauf verloren, der Bildebenen und Metadaten enthält. Ihr Container hat also seine PID-Zustände verloren.
Jeder Container sollte einen initialen (Root-) Prozess haben. Sie überschreiben den Standardeintrittspunkt in der Docker-Datei als Bash. [bearbeitet] Ich denke, selbst wenn Sie es nicht überschreiben, wird der Standard verwendet, der nicht im Ubuntu-Basisimage definiert ist. Sie sollten also Ihren anfänglichen Prozess mit dem Befehl cmd starten. Ich denke, es gibt keinen Fehler. Es ist eine Dockerfile-Funktion zur Wiederverwendbarkeit.
docker save nginx:alpine | ssh rmeote-host docker import -sha256:f6098fc18511abbbfe9e52ed0d0ccc1fbe4f7b018ee1cd85392999aa92ebba1b# we see errorsdocker container run -d -p 2020:80 nginx:alpinedocker: Error response from daemon: No command specified.See 'docker run --help'.
bei Verwendung von load
docker save nginx:alpine | ssh remote-host "cat - | docker load"Loaded image: nginx:alpinedocker container run --name nginx -dp 2020:80 nginx:alpine7cc8836bef1e276f8aa986a09186e9e227542be3b094b082b9ab1f6d3c290a99docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7cc8836bef1e nginx:alpine "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:2020->80/tcp, :::2020->80/tcp nginx