Pourquoi docker conteneur quitte immédiatement
Je lance un conteneur en arrière-plan à l'aide de
docker run -d --name hadoop h_Service
il quitte rapidement. Mais si je lance en premier plan, il fonctionne très bien. J'ai vérifié les logs à l'aide de
docker logs hadoop
il n'y a 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
- pouvez-vous nous montrer votre Dockerfile et la complète exécution de la commande ?
- Je ll de modifier et de vous montrer le panneau de fichier. je vous ai fourni déjà exécuté la commande
- La règle d'or est que vous devez prévenir votre dockerized serveurs de daemonizing. La plupart des paquetages du serveur ont des options pour les forcer au premier plan depuis daemonizing est le cas normal.
Vous devez vous connecter pour publier un commentaire.
Un conteneur docker ferme lors de ses principaux processus se termine.
Dans ce cas, il sera de sortie lors de votre
start-all.sh
la fin du script. Je ne sais pas assez sur hadoop pour vous dire comment faire dans ce cas, mais vous devez laisser quelque chose en cours d'exécution dans le premier plan ou l'utilisation d'un gestionnaire de processus tels que runit ou supervisord pour exécuter le processus.Je pense que vous devez vous tromper à ce sujet de travail si vous ne spécifiez pas
-d
; elle doit avoir exactement le même effet. Je soupçonne que vous avez lancé avec un peu différente de commande ou à l'aide de-it
qui va changer les choses.Une solution simple peut être ajouter quelque chose comme:
while true; do sleep 1000; done
à la fin du script. Je n'aime pas cela, cependant, que le script doit vraiment être suivi du processus qu'il a débuté.
(Je dois dire que j'ai volé le code de https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh)
Cela a fonctionné pour moi:
Après cela, j'ai vérifié pour le processus en cours d'exécution à l'aide de:
Pour fixer de nouveau le récipient
CONSEIL: Pour quitter sans arrêter le type de conteneur:
^P^Q
-it
drapeauxdit
faire? J'ai penséi
était interactive..?-dit
est juste l'abréviation-t
option est redondant lorsqu'il est utilisé avec-d
si je comprends bien-t
activé... mais depuis que j'ai l'habitude deexec
un nouveau bash à chaque fois je ne suis pas d'avis. J'ai eu des problèmes de détacher à partir d'un mac, mais peut-être que je fais mal..docker ps -a
pour le voir, il ne fonctionne pas pour vous. Cette commande affiche TOUS les conteneurs existants, y compris ceux qui ne sont PAS en cours d'exécution. La commandedocker ps
seul est le bon de commande pour voir l'exécution de conteneursJe voudrais prolonger ou oserais-je dire, d'améliorer la réponse évoquée par camposer
Lorsque vous exécutez
vous êtes essentiellement l'exécution du conteneur en arrière-plan en mode interactif.
Lorsque vous joindre et quitter le conteneur par CTRL+D (la plus commune façon de le faire), vous arrêtez le conteneur parce que vous juste de tuer le processus principal qui vous commencé votre récipient avec la commande ci-dessus.
Faire parti d'une déjà en cours d'exécution conteneur, je voudrais juste la fourche d'un autre processus de bash et d'obtenir un pseudo TTY en cours d'exécution:
chaque fois que je veux un conteneur de rester après la fin de l'exécution du script je ajouter
à la fin de la commande. Il devrait donc être:
Une bonne approche serait de commencer votre processus et services en cours d'exécution en arrière-plan et utiliser les
wait [n ...]
de commande à la fin de votre script. En bash, la commande d'attente des forces de l'actuel processus d':J'ai eu cette idée de Sébastien Pujadas' script de démarrage pour son elk construire.
Prise à partir de la question d'origine, votre start-all.sh ressemblerait à quelque chose comme ça...
Si vous voulez forcer l'image à accrocher partout (dans l'ordre de débogage ou de quelque chose d'examiner l'état du système de fichiers), vous pouvez remplacer le point d'entrée pour changer de shell:
Mon pracitce est dans le Dockerfile lancer un interpréteur de commandes qui ne sera pas le quitter immédiatement
CMD [ "sh", "-c", "service ssh start; bash"]
, puis exécutezdocker run -dit image_name
. De cette façon, le (ssh) et du service de conteneur est en cours d'exécution.Ajoutant
exec "$@"
à la fin de mon script shell était mon fix!
Il existe de nombreuses façons de provoquer un menu fixe pour le quitter immédiatement. Pour moi, c'était le problème avec mon
Dockerfile
. Il y avait un bug dans le fichier. J'ai euENTRYPOINT ["dotnet", "M4Movie_Api.dll]
au lieu deENTRYPOINT ["dotnet", "M4Movie_Api.dll"]
. Comme vous pouvez le voir j'avais raté une citation(") à la fin.Pour analyser le problème que j'ai commencé mon conteneur et rapidement fixé mon récipient de sorte que j'ai pu voir quel était le problème exact.
Où 4ea373efa21b est mon numéro du conteneur. Cela me conduit à la question de l'heure.
Après avoir trouvé le problème, j'ai dû construire, restaurer, de publier mon conteneur de nouveau.
Ajouter ceci à la fin de Dockerfile:
Exemple de menu fixe de fichier:
Référence
Vous pouvez exécuter le conteneur à l'aide de ce redémarrage drapeau.
Car l'image est un linux, une chose à vérifier est de s'assurer que tous les scripts shell utilisé dans le conteneur ont des fins de ligne unix. Si ils ont un ^M à la fin, alors qu'ils sont windows fins de ligne. Un moyen de les corriger est avec dos2unix sur /usr/local/start-all.sh pour les convertir à partir de windows à unix. L'exécution de l'docker en mode interactif peut aider à comprendre d'autres problèmes. Vous pouvez avoir un nom de fichier de la faute de frappe ou de quelque chose. voir https://en.wikipedia.org/wiki/Newline