web-dev-qa-db-fra.com

Pourquoi le conteneur docker quitte immédiatement

Je lance un conteneur en arrière-plan en utilisant

 docker run -d --name hadoop h_Service

ça sort vite. Mais si je cours au premier plan, cela fonctionne bien. J'ai vérifié les journaux en utilisant

docker logs hadoop

il n'y avait pas d'erreur. Des idées?

DOCKERFILE

 FROM Java_ubuntu_new
 RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/AMD64/cdh4-repository_1.0_all.deb
 RUN dpkg -i cdh4-repository_1.0_all.deb
 RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/AMD64/cdh/archive.key | apt-key add -
 RUN  apt-get update
 RUN apt-get install -y hadoop-0.20-conf-pseudo
 RUN dpkg -L hadoop-0.20-conf-pseudo
 USER hdfs
 RUN hdfs namenode -format
 USER root
 RUN apt-get install -y Sudo
 ADD . /usr/local/
 RUN chmod 777 /usr/local/start-all.sh
 CMD ["/usr/local/start-all.sh"]

start-all.sh

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start
 /etc/init.d/hadoop-hdfs-datanode start
 /etc/init.d/hadoop-hdfs-secondarynamenode start
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start
 Sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start
 /bin/bash
186
GoMan

Un conteneur de menu fixe se ferme à la fin de son processus principal.

Dans ce cas, il se fermera à la fin de votre script start-all.sh. Je ne connais pas suffisamment hadoop pour vous expliquer comment procéder, mais vous devez laisser quelque chose en marche au premier plan ou utiliser un gestionnaire de processus tel que runit ou supervisord pour exécuter les processus.

Je pense que vous devez vous tromper si cela ne fonctionne pas si vous ne spécifiez pas -d; cela devrait avoir exactement le même effet. Je suppose que vous l'avez lancé avec une commande légèrement différente ou en utilisant -it qui changera les choses.

Une solution simple peut être d'ajouter quelque chose comme:

while true; do sleep 1000; done

à la fin du script. Je n'aime pas cela, cependant, car le script devrait vraiment surveiller les processus qu'il a démarrés.

(Je devrais dire que j'ai volé ce code de https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh )

101
Adrian Mouat

Cela a fait le tour pour moi:

docker run -dit ubuntu

Après cela, j'ai vérifié les processus en cours d'exécution en utilisant:

docker ps -a

Pour attacher à nouveau le conteneur

docker attach CONTAINER_NAME

CONSEIL: pour quitter sans arrêter le type de conteneur: ^P^Q

178
camposer

Je voudrais prolonger ou oser oser dire, améliorer la réponse mentionnée par camposer

Quand tu cours

docker run -dit ubuntu

vous exécutez essentiellement le conteneur en arrière-plan en mode interactif.

Lorsque vous attachez et quittez le conteneur par CTRL + D (méthode la plus courante), vous arrêtez le conteneur car vous venez de tuer le processus principal pour lequel vous avez démarré votre conteneur avec la commande ci-dessus.

En tirant parti d'un conteneur déjà en cours d'exécution, je voudrais simplement lancer un autre processus de bash et obtenir un pseudo TTY en exécutant:

docker exec -it <container ID> /bin/bash
52
Krishna Gupta

chaque fois que je veux qu'un conteneur reste en place après avoir terminé l'exécution du script, j'ajoute

&& tail -f /dev/null

en fin de commande. Donc ça devrait être:

/usr/local/start-all.sh && tail -f /dev/null
23
Thiago Ramos

Une bonne approche serait de démarrer vos processus et services en les exécutant en arrière-plan et d’utiliser la commande wait [n ...] à la fin de votre script. Dans bash, la commande wait force le processus en cours à:

Attendez chaque processus spécifié et renvoyez son statut de fin. Si n n'est pas indiqué, tous les processus enfants actuellement actifs sont attendus et l'état de retour est égal à zéro.

J'ai eu cette idée de Sébastien Pujadas ' script de démarrage pour sa construction d'élan .

À partir de la question initiale, votre start-all.sh ressemblerait à quelque chose comme ça ...

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start &
 /etc/init.d/hadoop-hdfs-datanode start &
 /etc/init.d/hadoop-hdfs-secondarynamenode start &
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start &
 Sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start &
 wait
15
Brian Olsen

Pourquoi le conteneur docker se termine immédiatement?

Si vous voulez forcer l'image à traîner (pour déboguer quelque chose ou examiner l'état du système de fichiers), vous pouvez remplacer le point d'entrée pour le changer en Shell:

docker run -it --entrypoint=/bin/bash myimagename
6
RJFalconer

Ma pratique est dans le fichier Dockerfile démarrer un shell qui ne sera pas quitter immédiatement CMD [ "sh", "-c", "service ssh start; bash"], puis exécutez docker run -dit image_name. De cette façon, le service (ssh) et le conteneur sont en cours d'exécution.

3
Leon

Ajouter

exec "$ @"

à la fin de mon script shell était ma solution!

1
Adam k

Si vous vérifiez Dockerfile à partir de conteneurs, par exemple fballiano/magento2-Apache-php

vous verrez qu'à la fin de son fichier, il ajoute la commande suivante: while true; dormez 1; terminé

Maintenant, ce que je recommande, est que vous fassiez ceci

docker container ls --all | grep 127

Ensuite, vous verrez si votre image de menu fixe présentait une erreur. Si elle se termine avec 0, elle aura probablement besoin de l’une de ces commandes qui dormira pour toujours.

1
xavierbaez

Ajoutez ceci à la fin de Dockerfile:

CMD tail -f /dev/null

Exemple de fichier Docker:

FROM ubuntu:16.04

# other commands

CMD tail -f /dev/null

référence

1
Kert Kukk

Il existe de nombreuses façons possibles de faire quitter immédiatement un menu fixe. Pour moi, c’était le problème de ma Dockerfile. Il y avait un bug dans ce fichier. J'avais ENTRYPOINT ["dotnet", "M4Movie_Api.dll] au lieu de ENTRYPOINT ["dotnet", "M4Movie_Api.dll"]. Comme vous pouvez le constater, j’avais manqué une citation (") à la fin.

Pour analyser le problème, j'ai démarré mon conteneur et attaché rapidement mon conteneur afin de voir quel était le problème exact.

C:\SVenu\M4Movie\Api\Api>docker start 4ea373efa21b


C:\SVenu\M4Movie\Api\Api>docker attach 4ea373efa21b

Où 4ea373efa21b est mon identifiant de conteneur. Cela me conduit à la question réelle.

enter image description here

Après avoir trouvé le problème, je devais créer, restaurer, publier à nouveau mon conteneur.

0
Sibeesh Venu