Pourquoi le conteneur Docker se ferme immédiatement

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

docker run -d --name hadoop h_Service 

il sort rapidement. Mais si je cours au premier plan, ça marche 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 

Un conteneur de docker se termine lorsque son processus principal se termine.

Dans ce cas, il se terminera lorsque votre script start-all.sh se terminera. Je ne connais pas assez le hadoop pour savoir comment procéder dans ce cas, mais vous devez soit laisser quelque chose fonctionner 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 à ce sujet si vous ne spécifiez pas -d ; cela devrait avoir exactement le même effet. Je soupçonne 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’append 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 lancés.

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

Cela a fait le tour pour moi:

 docker run -dit ubuntu 

Après cela, je peux voir les processus en cours d’exécution:

 docker ps -a 

Pour attacher à nouveau le conteneur

 docker attach CONTAINER_NAME 

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

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

Quand tu cours

 docker run -dit ubuntu 

En gros, vous exécutez le conteneur en arrière-plan en mode interactif.

Lorsque vous attachez et quittez le conteneur par CTRL + D (la manière la plus courante de le faire), vous arrêtez le conteneur car vous venez de tuer le processus principal dans 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 me contenterais de lancer un autre processus de bash et d’obtenir un pseudo TTY en exécutant:

 docker exec -it  /bin/bash 

chaque fois que je veux un conteneur pour restr en place après avoir terminé l’exécution du script, j’ajoute

 && tail -f /dev/null 

à la fin de la commande. Donc ça devrait être:

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

Une approche intéressante serait de démarrer vos processus et services 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 retournez son statut de résiliation. Si n n’est pas donné, tous les processus enfants actuellement actifs sont attendus et le statut de retour est zéro.

J’ai eu cette idée du script de démarrage de Sébastien Pujadas pour son élan .

En prenant la question initiale, vous êtes start-all.sh ressemblerait à ceci …

  #!/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 

Ma pratique est dans le Dockerfile start un shell qui ne sortira pas immédiatement de CMD [ "sh", "-c", "service ssh start; bash"] , puis exécutera docker run -dit image_name . De cette façon, le service (ssh) et le conteneur fonctionnent.

Ajouter

exec “$ @”

à la fin de mon script shell était mon correctif!

Il existe de nombreuses façons de provoquer la sortie immédiate d’un menu fixe. Pour moi, c’était le problème avec mon Dockerfile . Il y avait un bogue dans ce fichier. J’ai eu ENTRYPOINT ["dotnet", "M4Movie_Api.dll] au lieu de ENTRYPOINT ["dotnet", "M4Movie_Api.dll"] . Comme vous pouvez le voir, j’ai manqué une citation (“) à la fin.

Pour parsingr 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 au problème réel.

entrer la description de l'image ici

Après avoir trouvé le problème, j’ai dû créer, restaurer, publier à nouveau mon conteneur.

Étant donné que l’image est un Linux, une chose à vérifier est de s’assurer que tous les scripts shell utilisés dans le conteneur ont des fins de ligne Unix. S’ils ont un ^ M à la fin, alors ce sont des fins de ligne Windows. Un moyen de les corriger est d’utiliser dos2unix sur /usr/local/start-all.sh pour les convertir de Windows en Unix. L’exécution du menu fixe en mode interactif peut vous aider à résoudre d’autres problèmes. Vous pourriez avoir une faute de frappe de nom de fichier ou quelque chose. voir https://en.wikipedia.org/wiki/Newline