web-dev-qa-db-fra.com

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

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 le conteneur u1 à partir de cela. Ensuite, nous exportons ce conteneur dans un fichier (exported), arrêtons/supprimons le conteneur, importons le fichier dans une nouvelle image (ubuntu:imported) et essayez d'exécuter un nouveau conteneur à partir de celui-ci. Il échoue.

17
Greendrake

docker export n'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 avait CMD ["/usr/bin/supervisord"] dedans, puis importez votre vidage de cette façon:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
19
Greendrake

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

enter image description here

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
2
Ogglas

Lorsque vous exportez un conteneur, il a perdu son propre historique qui contient des couches d'image 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. [édité] 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. Il s'agit d'une fonctionnalité de fichier docker pour la réutilisabilité.

1
pmoksuz

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?

0
030