Ejecuto un contenedor en segundo plano usando
docker run -d --name hadoop h_Service
Sale rápidamente. Pero si corro en primer plano, funciona bien. Revisé los registros usando
docker logs hadoop
No hubo error. ¿Algunas ideas?
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
es inseguro e incorrecto. Debería volver a los permisos sanos (probablemente 755 en este caso).Respuestas:
Un contenedor acoplable sale cuando finaliza su proceso principal.
En este caso, saldrá cuando
start-all.sh
finalice su secuencia de comandos. No sé lo suficiente sobre hadoop para decirle cómo hacerlo en este caso, pero debe dejar algo ejecutándose en primer plano o utilizar un administrador de procesos como runit o supervisor para ejecutar los procesos.Creo que debes equivocarte si funciona si no lo especificas
-d
; Debería tener exactamente el mismo efecto. Sospecho que lo lanzó con un comando ligeramente diferente o con el-it
que cambiará las cosas.Una solución simple puede ser agregar algo como:
while true; do sleep 1000; done
hasta el final del guión. Sin embargo, no me gusta esto, ya que el script realmente debería estar monitoreando los procesos que inició.
(Debo decir que robé ese código de https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh )
fuente
Esto hizo el truco para mí:
Después de eso, verifiqué los procesos que se ejecutan usando:
Para volver a colocar el contenedor
SUGERENCIA: para salir sin detener el tipo de contenedor:
^P^Q
fuente
-dit
es solo una abreviatura-di
es el mínimo requerido, la-t
opción es redundante cuando se usa-d
si entiendo correctamente-t
habilitarlo ... pero como generalmente hagoexec
una nueva fiesta cada vez que no me doy cuenta. He tenido problemas para desconectarme de una Mac, pero tal vez estoy haciendo esto mal ..Me gustaría extender o atreverme a decir, mejorar la respuesta mencionada por camposer
Cuando corres
básicamente está ejecutando el contenedor en segundo plano en modo interactivo.
Cuando conecta y sale del contenedor mediante CTRL + D (la forma más común de hacerlo), detiene el contenedor porque acaba de matar el proceso principal que inició su contenedor con el comando anterior.
Aprovechando un contenedor que ya se está ejecutando, simplemente bifurcaría otro proceso de bash y obtendría un pseudo TTY ejecutando:
fuente
cada vez que quiero que un contenedor permanezca activo después de terminar la ejecución del script, agrego
al final del comando. Entonces debería ser:
fuente
Si desea forzar la imagen para que se cuelgue (para depurar algo o examinar el estado del sistema de archivos), puede anular el punto de entrada para cambiarlo a un shell:
fuente
Un buen enfoque sería iniciar sus procesos y servicios ejecutándolos en segundo plano y usar el
wait [n ...]
comando al final de su secuencia de comandos. En bash, el comando de espera obliga al proceso actual a:Tengo esta idea del guión de inicio de Sébastien Pujadas para su construcción de alces .
Tomando de la pregunta original, su start-all.sh se vería así ...
fuente
Agregue esto al final de Dockerfile:
Archivo Docker de muestra:
Referencia
fuente
CMD tail -f /dev/null
lo atraviesash -c "..."
. ¿Podemos usar elexec
formulario en su lugar? Es decirCMD ["tail", "-f", "/dev/null"]
Mi práctica es en el Dockerfile iniciar un shell que no saldrá inmediatamente
CMD [ "sh", "-c", "service ssh start; bash"]
, luego se ejecutarádocker run -dit image_name
. De esta manera, el servicio (ssh) y el contenedor se están ejecutando.fuente
Añadí
read
declaración concha al final. Esto mantiene el proceso principal del contenedor (script de shell de inicio) en ejecución.fuente
Agregando
Al final de mi script de shell fue mi solución!
fuente
Si verifica Dockerfile desde contenedores, por ejemplo fballiano / magento2-apache-php
verá que al final de su archivo agrega el siguiente comando: mientras es verdadero; duerme 1; hecho
Ahora, lo que recomiendo es que hagas esto
Luego, verá si la imagen de su ventana acoplable tuvo un error, si sale con 0, entonces probablemente necesite uno de estos comandos que se suspenderá para siempre.
fuente
Hay muchas formas posibles de hacer que una ventana acoplable salga de inmediato. Para mí, fue el problema con mi
Dockerfile
. Hubo un error en ese archivo. Tenía enENTRYPOINT ["dotnet", "M4Movie_Api.dll]
lugar deENTRYPOINT ["dotnet", "M4Movie_Api.dll"]
. Como puede ver, me había perdido una cita (") al final.Para analizar el problema, inicié mi contenedor y rápidamente lo conecté para poder ver cuál era el problema exacto.
Donde 4ea373efa21b es mi id de contenedor. Esto me lleva al problema real.
Después de encontrar el problema, tuve que construir, restaurar y publicar mi contenedor nuevamente.
fuente
Viniendo de duplicados, no veo ninguna respuesta aquí que aborde el antipatrón muy común de ejecutar su carga de trabajo principal como un trabajo en segundo plano, y luego me pregunto por qué Docker sale.
En términos simples, si tienes
luego saque el
&
para ejecutar el trabajo en primer plano o agregueal final del script para que espere todos los trabajos en segundo plano.
Seguirá saliendo si la carga de trabajo principal sale, así que quizás ejecute esto en un
while true
bucle para forzarlo a reiniciarse para siempre:(Nótese también cómo escribir
while true
. Es común ver cosas tontas comowhile [ true ]
owhile [ 1 ]
lo que ocurra por casualidad a trabajar, pero no me refiero a lo que el autor probablemente imaginó que debería significar).fuente
Debe ejecutarlo con la bandera -d para dejarlo ejecutándose como daemon en segundo plano.
fuente
Puede ejecutar el contenedor con este indicador de reinicio.
fuente
Como la imagen es un linux, una cosa que debe verificar es asegurarse de que todos los scripts de shell utilizados en el contenedor tengan terminaciones de línea unix. Si tienen un ^ M al final, entonces son terminaciones de línea de Windows. Una forma de solucionarlos es con dos2unix en /usr/local/start-all.sh para convertirlos de Windows a Unix. Ejecutar la ventana acoplable en modo interactivo puede ayudar a resolver otros problemas. Podría tener un error tipográfico de nombre de archivo o algo así. ver https://en.wikipedia.org/wiki/Newline
fuente