«Aucune commande spécifiée» à partir de l'image / du conteneur Docker réimporté

16

J'essaie de prendre un conteneur Docker d'une machine et de l'exécuter sur une autre et de rencontrer cette erreur: " Réponse d'erreur du démon: aucune commande spécifiée ".

Voici un exemple simplifié illustrant le problème:

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.

Dans cet exemple, nous tirons d'abord une image (ubuntu) et créons / exécutons avec succès un conteneur à u1partir de celle-ci. Ensuite, nous exportons ce conteneur dans un fichier ( exported), arrêtons / supprimons le conteneur, importons le fichier dans une nouvelle image ( ubuntu:imported) et essayons d'exécuter un nouveau conteneur à partir de celui-ci. Il échoue.

Greendrake
la source

Réponses:

16

docker exportn'exporte pas tout sur le conteneur - juste le système de fichiers. Ainsi, lors de la réimportation du cliché dans une nouvelle image Docker, des indicateurs supplémentaires doivent être spécifiés pour recréer le contexte.

Par exemple, si le conteneur d'origine fonctionnait correctement car le Dockerfile utilisé pour créer son image s'y trouvait CMD ["/usr/bin/supervisord"], importez votre vidage de cette façon:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Greendrake
la source
2
Vous pouvez exécuter la docker inspect imagename:tagnamecomparaison de l'original et de celui importé. Je n'ai pas eu de chance avec import/ exportet --change, bien que tout fonctionne bien avec save/ load.
earcam
2

Vous avez cette erreur lorsque vous essayez d'exporter et d'importer Docker microsoft/mssql-server-linux.

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

Commandes d'exportation et d'importation:

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

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

Cependant, nous n'avons pas pu trouver la commande pour l'exécuter. La solution consistait à répertorier tous les conteneurs sur la machine d'exportation et à exécuter la commande.

docker ps

entrez la description de l'image ici

De là, nous pourrions découvrir comment exécuter la commande correcte:

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

Lorsque vous exportez un conteneur, il a perdu son propre historique qui contient des couches d'images et des métadonnées. Votre conteneur a donc perdu ses états pid.

Chaque conteneur doit avoir un processus initial (racine). Vous remplacez le point d'entrée par défaut du dockerfile en tant que bash. [modifié] Je pense que même si vous ne remplacez pas, il utilise par défaut, non défini dans l'image de base ubuntu. Vous devez donc démarrer votre processus initial avec la commande cmd. Je pense qu'il n'y a pas de bug. C'est une fonction de dockerfile pour la réutilisabilité.

pmoksuz
la source
Je remplace le point d'entrée dans la solution de contournement au problème d'origine uniquement. Rien n'est annulé lors de l'exportation / importation.
Greendrake
salut @DrakeES ma réponse vient d'être mise à jour. J'explique ce qui se passe lorsque vous exportez un conteneur.
pmoksuz
0

Je l'ai fait avec ces étapes supplémentaires:

  1. Créez Dockerfile comme suit:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Construire une nouvelle image:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Maintenant, il s'exécutera:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Cependant, on ne sait toujours pas pourquoi l'image simplement exportée puis importée ne fonctionne pas immédiatement. Est-ce un bug?

030
la source
-1

vous pouvez utiliser la docker loadcommande pour charger des images à partir du fichier d'archive. cette commande importera le fichier image et les arguments ensemble.

Jian Pei
la source
1
Qu'est-ce que le fichier "archive" dans ce cas et comment le créer?
Greendrake
2
@Greendrake docker loadet docker saveopèrent sur des images de conteneurs (à partir desquelles les conteneurs sont créés), docker importet docker exportopèrent sur des conteneurs.
Michael Hampton