J'exécute 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 a pas eu 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
chmod 777
est incertain et faux. Vous devez revenir à des autorisations raisonnables (probablement 755 dans ce cas).Réponses:
Un conteneur Docker se termine lorsque son processus principal se termine.
Dans ce cas, il se fermera à la fin de votre
start-all.sh
script. Je ne sais pas assez sur hadoop pour vous dire comment le faire dans ce cas, mais vous devez soit laisser quelque chose en cours d'exécution au premier plan, soit 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 soupçonne que vous l'avez lancé avec une commande légèrement différente ou en utilisant-it
ce 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 lancés.
(Je dois dire que j'ai volé ce code sur https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh )
la source
Cela a fait l'affaire pour moi:
Après cela, j'ai vérifié les processus en cours d'exécution en utilisant:
Pour fixer à nouveau le conteneur
CONSEIL: Pour quitter sans arrêter le type de conteneur:
^P^Q
la source
-dit
est juste un raccourci-di
est le minimum requis, l'-t
option est redondante lorsqu'elle est utilisée avec-d
si je comprends bien-t
activé ... mais puisque j'ai généralementexec
un nouveau bash chaque fois que je ne le remarque pas. J'ai eu des problèmes pour me détacher d'un Mac mais peut-être que je me trompe.Je voudrais étendre ou oserais-je dire, améliorer la réponse mentionnée par camposer
Quand tu cours
vous exécutez essentiellement le conteneur en arrière-plan en mode interactif.
Lorsque vous attachez et quittez le conteneur par CTRL + D (la façon la plus courante de le faire), vous arrêtez le conteneur parce que vous venez de tuer le processus principal qui a démarré votre conteneur avec la commande ci-dessus.
Profitant d'un conteneur déjà en cours d'exécution, je bifurquerais simplement un autre processus de bash et obtiendrais un pseudo TTY en exécutant:
la source
chaque fois que je veux qu'un conteneur reste en place après avoir terminé l'exécution du script j'ajoute
en fin de commande. Il devrait donc être:
la source
Si vous souhaitez forcer l'image à traîner (afin de déboguer quelque chose ou d'examiner l'état du système de fichiers), vous pouvez remplacer le point d'entrée pour le changer en shell:
la source
Une bonne approche serait de démarrer vos processus et services en les exécutant en arrière-plan et d'utiliser la
wait [n ...]
commande à la fin de votre script. En bash, la commande wait force le processus en cours à:J'ai eu cette idée dans le script de démarrage de Sébastien Pujadas pour sa construction d'élans .
Prenant la question d'origine, votre start-all.sh ressemblerait à quelque chose comme ça ...
la source
Ajoutez ceci à la fin de Dockerfile:
Exemple de fichier Docker:
Référence
la source
CMD tail -f /dev/null
le traversesh -c "..."
. Pouvons-nous utiliser leexec
formulaire à la place? C'est à direCMD ["tail", "-f", "/dev/null"]
Ma pratique est dans le Dockerfile démarrer un shell qui ne sortira pas immédiatement
CMD [ "sh", "-c", "service ssh start; bash"]
, puis s'exécuteradocker run -dit image_name
. De cette façon, le service (ssh) et le conteneur sont en cours d'exécution.la source
J'ai ajouté une
read
déclaration shell à la fin. Cela maintient le processus principal du conteneur - script shell de démarrage - en cours d'exécution.la source
Ajouter
à la fin de mon script shell était ma solution!
la source
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; dors 1; terminé
Maintenant, ce que je recommande, c'est que vous fassiez cela
Ensuite, vous verrez si votre image docker avait une erreur, si elle se termine par 0, alors elle a probablement besoin d'une de ces commandes qui dormira pour toujours.
la source
Il existe plusieurs façons de provoquer la fermeture immédiate d'un docker. Pour moi, c'était le problème avec mon
Dockerfile
. Il y avait un bogue dans ce fichier. J'avaisENTRYPOINT ["dotnet", "M4Movie_Api.dll]
au lieu deENTRYPOINT ["dotnet", "M4Movie_Api.dll"]
. Comme vous pouvez le voir, j'avais oublié une citation (") à la fin.Pour analyser le problème, j'ai démarré mon conteneur et j'ai rapidement attaché mon conteneur afin que je puisse voir quel était le problème exact.
Où 4ea373efa21b est mon identifiant de conteneur. Cela m'amène au problème réel.
Après avoir trouvé le problème, j'ai dû créer, restaurer, publier à nouveau mon conteneur.
la source
Venant de doublons, je ne vois aucune réponse ici qui traite de l'anti-modèle très courant consistant à exécuter votre charge de travail principale en tant que tâche d'arrière-plan, puis à vous demander pourquoi Docker se ferme.
En termes simples, si vous avez
puis retirez le
&
pour exécuter le travail au premier plan ou ajoutezà la fin du script pour le faire attendre tous les travaux en arrière-plan.
Il quittera alors toujours si la charge de travail principale se termine, alors peut-être l'exécuter en
while true
boucle pour le forcer à redémarrer indéfiniment:(Remarquez également comment écrire
while true
. Il est courant de voir des choses idiotes commewhile [ true ]
ouwhile [ 1 ]
qui se produisent par hasard, mais ne signifient pas ce que l'auteur a probablement imaginé qu'elles devraient signifier.)la source
Vous devez l'exécuter avec l'indicateur -d pour le laisser s'exécuter en tant que démon en arrière-plan.
la source
Vous pouvez exécuter le conteneur à l'aide de cet indicateur de redémarrage.
la source
Puisque 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, ce sont des fins de ligne Windows. Une façon de les corriger est d'utiliser dos2unix sur /usr/local/start-all.sh pour les convertir de Windows vers Unix. L'exécution du docker en mode interactif peut aider à résoudre d'autres problèmes. Vous pourriez avoir une faute de frappe ou quelque chose comme ça. voir https://en.wikipedia.org/wiki/Newline
la source