Docker - Le conteneur n'est pas en cours d'exécution


88

Je suis complètement novice dans les dockers. J'ai essayé de démarrer un conteneur sorti comme suit,

  1. J'ai répertorié tous les conteneurs disponibles en utilisant docker ps -a. Il énumère les éléments suivants:

    docker liste toutes les images

  2. J'ai entré les commandes suivantes pour démarrer le conteneur qui est dans l'étape de sortie et entrer dans le terminal de cette image.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Il lance l'erreur suivante.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Mais quand je démarre le conteneur en utilisant docker start 79b3fa70b51d. Il jette l'ID du conteneur en sortie, ce qui est normal si tout fonctionne normalement. Je ne suis pas sûr de la cause de cette erreur. Toute idée sur les causes et suggestions à ce sujet me serait très utile. Merci d'avance.


7
Bonjour, Pouvez-vous expliquer comment vous avez résolu ce problème. J'ai peur que la réponse ci-dessous n'ait pas beaucoup de sens
JayPex

4
@ApexFred, les conteneurs Docker ne sont pas comme des VM; ils sont conçus pour exécuter une application. Lorsque l'application se termine, le conteneur fait de même. Dans ce cas, l'utilisateur a défini l '"application" du conteneur sur la commande "echo". Comme la commande "echo" exécute un écho puis se termine, le conteneur se termine également par la commande. S'il redémarre le conteneur, il effectue l'écho et s'arrête à nouveau. La commande EXEC nécessite un conteneur en cours d'exécution. Étant donné que le conteneur est terminé, il ne peut pas être utilisé pour exécuter des commandes supplémentaires.
duct_tape_coder

Réponses:


30

Container 79b3fa70b51dsemble ne faire qu'un echo.

Cela signifie qu'il démarre, fait écho puis quitte immédiatement.

La docker execcommande suivante ne le trouverait pas en cours d'exécution pour s'attacher à ce conteneur et exécuter une commande: il est trop tard. Le conteneur est déjà sorti.

La docker execcommande exécute une nouvelle commande dans un conteneur en cours d'exécution.

La commande démarrée à l'aide docker execne s'exécutera que pendant l'exécution du processus principal du conteneur (PID 1)


1
Hey VonC, merci pour votre commentaire. Comment puis-je parvenir à entrer dans le terminal de l'image?
Stranger

3
@Udhayakumar Un simple docker run -it --rm udhayakumar/busyboxwithtouchdevrait suffire pour ouvrir une session. Le point d'entrée par défaut doit être / bin / sh, mais cela dépend de votre Dockerfile: vous avez peut-être défini un autre point d'entrée et / ou un CMD différent.
VonC

50
Bonjour, Pouvez-vous expliquer comment vous avez résolu ce problème. J'ai peur que cette réponse n'ait pas beaucoup de sens
JayPex

2
@Jawad En exécutant busyboxwithtouch sans aucun paramètre, il utilise par défaut le shell interactif (qui ne se ferme pas immédiatement). Cela signifie que vous pourrez plus tard ( docker exec) y attacher.
VonC

61

Par défaut, le conteneur Docker se fermera immédiatement si aucune tâche n'est en cours d'exécution sur le conteneur.

Pour que le conteneur continue de fonctionner en arrière-plan, essayez de l'exécuter avec l' argument --detach(ou -d).

Pour des exemples:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

22

S'il n'est pas possible de redémarrer le processus principal (assez longtemps), il y a aussi la possibilité de faire commitpasser le conteneur à une nouvelle image et d'exécuter un nouveau conteneur à partir de cette image. Bien que ce ne soit pas le flux de travail habituel des meilleures pratiques , je trouve qu'il est vraiment utile de déboguer un script défaillant de temps en temps.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#

J'ai suivi la même étape, mais le conteneur nouvellement créé n'est pas accessible à partir du navigateur qui était accessible auparavant
Muhammad Muazzam

1
Veuillez noter que la commande lance un bashprocessus dans le conteneur. Vous aviez probablement déjà un serveur Web en cours d'exécution, vous devrez donc vérifier quelle commande doit être utilisée pour remettre le serveur en marche.
Matthias Kuhn

10

Tout d'abord, nous devons démarrer le conteneur docker

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Après cela, vérifiez le conteneur du docker:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Puis exécutez en utilisant la commande ci-dessous:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 

Il serait utile d'ajouter un texte qui aide à expliquer votre réponse.
Lauren Van Sloun

9

Cela se produit avec les images pour lesquelles le script ne lance pas de service en attente de requêtes , par conséquent le conteneur se termine à la fin du script.

C'est généralement le cas avec la plupart des images de base du système d'exploitation (centos, Debian, etc.), ou également avec les images de nœuds .

Votre meilleur pari est d'exécuter l'image en mode interactif . Exemple ci-dessous avec l' image du nœud :

docker run -it node /bin/bash

La sortie est

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

Voici ce qui a fonctionné pour moi.

Obtenez l'ID du conteneur et redémarrez.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

3

La raison est exactement ce que dit la réponse acceptée. J'ajoute des informations supplémentaires, qui peuvent fournir une meilleure compréhension de ce problème.

  1. L'état d'un conteneur comprend Created, Running, Stopped, Exited, Deadet d' autres que je sache.
  2. Lorsque nous exécutons docker create, le démon docker crée un conteneur avec son statut Created.
  3. Quand docker start, le démon docker démarrera un conteneur existant dont l'état peut être Createdou Stopped.
  4. Lorsque nous l'exécuterons docker run, le démon docker le terminera en deux étapes: docker createet docker start.
  5. Quand docker stop, évidemment, le démon docker arrêtera un conteneur. Ainsi, le conteneur serait en Stoppedétat.
  6. Venant du plus important, un conteneur s'imagine en fait contenir un processus de longue durée. Lorsque le processus se termine, le processus de maintien des conteneurs se termine également. Ainsi, le statut de ce conteneur serait Exited.

Quand le processus se termine-t-il? En un autre mot, quel est le processus, comment l'avons-nous lancé?
La réponse est CMDdans un fichier docker ou commanddans l'expression suivante, qui est bashpar défaut dans certaines images, c'est-à-dire ubutu: 18.04.

docker run ubuntu:18.04 [command]


2

Pour quiconque tente quelque chose de similaire en utilisant un Dockerfile ...

L'exécution en mode détaché n'aidera pas. Le conteneur se fermera toujours (s'arrêtera de fonctionner) si la commande n'est pas bloquante, c'est le cas avec bash.

Dans ce cas, une solution de contournement serait: 1. Validez l'image résultante: (container_name = le nom du conteneur sur lequel vous voulez baser l'image, image_name = le nom de l'image à créer docker commit container_name image_name 2. Utilisez docker run pour créer un nouveau conteneur en utilisant la nouvelle image, en spécifiant la commande que vous voulez exécuter. Ici, je vais lancer "bash": docker run -it image_name bash

Cela vous donnerait la connexion interactive que vous recherchez.


2

docker run -it <image_id> /bin/bash

Exécuter en mode interactif en exécutant puis bash shell


1
Je pense que le -ddrapeau est une faute de frappe ici?
Ian Buss

1

Voici une solution lorsque le conteneur Docker se ferme normalement et que vous pouvez modifier le Dockerfile.

En règle générale, lorsqu'un conteneur Docker est exécuté, une application est servie en exécutant une commande. À partir de la référence Dockerfile ,

Les instructions CMD et ENTRYPOINT définissent la commande exécutée lors de l'exécution d'un conteneur. ... Dockerfile doit spécifier au moins une des commandes CMD ou ENTRYPOINT.

Lorsque vous créez une image et ne spécifiez aucune commande avec CMD ou ENTRYPOINT, la commande CMD ou ENTRYPOINT de l'image de base est exécutée.

Par exemple, le Dockerfile officiel Ubuntu a CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Désormais, la bin/bash/commande peut accepter l'entrée et la docker run -it IMAGE_IDcommande attache STDIN au conteneur. Le résultat est que vous obtenez un terminal interactif et le conteneur continue de fonctionner.

Lorsqu'une commande avec CMD ou ENTRYPOINT est spécifiée dans le Dockerfile, cette commande est exécutée lors de l'exécution du conteneur. Maintenant, si cette commande peut se terminer sans nécessiter aucune entrée, elle se terminera et le conteneur se fermera. docker run -it IMAGE_IDne pas fournir le terminal interactif dans ce cas. Un exemple serait l'image du docker construite à partir du Dockerfile ci-dessous -

FROM ubuntu
ENTRYPOINT echo hello 

Si vous devez vous rendre sur le terminal de cette image, vous devrez maintenir le conteneur en marche en modifiant la commande entrypoint.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Après avoir exécuté le conteneur normalement avec docker run IMAGE_ID, vous pouvez simplement accéder à un autre terminal et utiliser docker exec -it CONTAINER_ID bashpour obtenir le terminal du conteneur.


"et vous pouvez éditer le Dockerfile": point clé ici. J'ai voté pour.
VonC

0

Dans mon cas, j'ai changé certains noms de fichiers et noms de répertoires du répertoire parent du Dockerfile. En raison de quel conteneur ne trouve pas les paramètres requis pour le redémarrer.

Après l'avoir renommé aux noms d'origine, le conteneur a commencé comme du beurre.


0

J'ai une vision différente de cela. Je pourrais faire un docker pset voir qu'il y a un conteneur docker en cours d'exécution, j'ai même essayé de le redémarrer, mais dès que j'essayais d'obtenir une session pour cela, New-PSSession -ContainerId $containerId -RunAsAdministratorcela ferait une erreur en disant:

## [error] New-PSSession: L'entrée ContainerId xxx n'existe pas, ## [error] ou le conteneur correspondant n'est pas en cours d'exécution.

Mon problème était que je fonctionnais avec le service réseau et qu'il n'avait pas assez d'autorisations pour voir le conteneur, même si je lui avais donné des autorisations pour exécuter des commandes docker (avec la configuration du groupe de sécurité docker)

Je ne savais pas comment activer le travail avec des conteneurs, j'ai donc dû recommencer à l'exécuter en tant qu'utilisateur administrateur à la place

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.