"Kein Befehl angegeben" aus erneut importiertem Docker-Image / Container

16

Ich versuche, einen Docker-Container von einem Computer zu nehmen und auf einem anderen auszuführen. Dabei tritt der folgende Fehler auf: " Fehlerantwort vom Dämon: Es wurde kein Befehl angegeben ".

Unten sehen Sie ein vereinfachtes Beispiel, das das Problem zeigt:

docker --version
Docker version 1.10.1, build 9e83765
docker pull ubuntu
docker run --name u1 -dit ubuntu:latest
docker export -o exported u1
docker stop u1
docker rm u1
docker import exported ubuntu:imported
docker run --name u1 -dit ubuntu:imported
docker: Error response from daemon: No command specified.

In diesem Beispiel ziehen wir zuerst ein Image (Ubuntu) und erstellen / starten daraus erfolgreich einen Container u1. Dann exportieren wir diesen Container in eine Datei ( exported), stoppen / entfernen den Container, importieren die Datei in ein neues Image ( ubuntu:imported) und versuchen, daraus einen neuen Container zu erstellen . Es schlägt fehl.

Greendrake
quelle

Antworten:

16

docker exportexportiert nicht alles über den Container - nur das Dateisystem. Wenn Sie den Dump zurück in ein neues Docker-Image importieren, müssen zusätzliche Flags angegeben werden, um den Kontext neu zu erstellen.

Wenn der ursprüngliche Container beispielsweise einwandfrei lief, weil sich in der Docker-Datei, mit der das Image erstellt wurde, Folgendes befand CMD ["/usr/bin/supervisord"], importieren Sie Ihren Dump folgendermaßen:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Greendrake
quelle
2
Sie können docker inspect imagename:tagnamedas Original mit dem importierten vergleichen. Ich hatte kein Glück mit import/ exportund --changeobwohl mit save/ alles gut funktioniert load.
earcam
2

Beim Versuch, Docker zu exportieren und zu importieren, ist dieser Fehler aufgetreten microsoft/mssql-server-linux.

https://hub.docker.com/r/microsoft/mssql-server-linux/

Befehle zum Exportieren und Importieren:

docker export --output "C:\Users\oscar\Desktop\sqlTestMS.tar" msSQL

docker import "C:\Users\oscar\Desktop\sqlTestMS.tar" mssql

Der Befehl zum Ausführen wurde jedoch nicht gefunden. Die Lösung bestand darin, alle Container auf der exportierenden Maschine aufzulisten und den ausgeführten Befehl zu überprüfen.

docker ps

Bildbeschreibung hier eingeben

Von dort konnten wir herausfinden, wie man den richtigen Befehl ausführt:

docker run --name msSQL -p 1401:1433 -d mssql:latest /opt/mssql/bin/sqlservr
Ogglas
quelle
1

Beim Exportieren eines Containers ging der eigene Verlauf verloren, der Bildebenen und Metadaten enthält. Ihr Container hat also seine PID-Zustände verloren.

Jeder Container sollte einen ersten (Root-) Prozess haben. Sie überschreiben den Standard-Entypoint in der Docker-Datei als Bash. [bearbeitet] Ich denke, auch Sie überschreiben es nicht verwendet Standard, nicht in Ubuntu Basis-Image definiert. Beginnen Sie den ersten Vorgang mit dem Befehl cmd. Ich denke es gibt keinen Bug. Es ist eine Dockerfile-Funktion für die Wiederverwendbarkeit.

pmoksuz
quelle
Ich überschreibe den Entypoint in der Problemumgehung nur für das ursprüngliche Problem. Beim Export / Import wird nichts überschrieben.
Greendrake
Hallo @DrakeES, meine Antwort wurde gerade aktualisiert. Ich erkläre, was passiert, wenn Sie einen Container exportieren.
pmoksuz
0

Mit diesen zusätzlichen Schritten funktioniert es:

  1. Erstellen Sie Dockerfile wie folgt:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Neues Image erstellen:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Jetzt läuft es:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Es ist jedoch immer noch unklar, warum das einfache Exportieren und anschließende Importieren von Bildern nicht sofort funktioniert. Ist das ein Bug?

030
quelle
-1

Mit dem docker loadBefehl können Sie Bilder aus der Archivdatei laden. Dieser Befehl importiert Bilddatei und Argumente zusammen.

Jian Pei
quelle
1
Was ist in diesem Fall eine "Archiv" -Datei und wie wird sie erstellt?
Greendrake
2
@Greendrake docker loadund docker saveoperiere auf Container-Images (aus denen Container erstellt werden), während docker importund docker exportoperiere auf Container.
Michael Hampton