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
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 )
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
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
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
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
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
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.
Ajouter
exec "$ @"
à la fin de mon script shell était ma solution!
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.
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
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.
Après avoir trouvé le problème, je devais créer, restaurer, publier à nouveau mon conteneur.