Por qué el contenedor docker sale inmediatamente


Corro un contenedor en segundo plano usando

 docker run -d --name hadoop h_Service

Sale rápidamente. Pero si corro en primer plano, funciona bien. Comprobé los registros usando

docker logs hadoop

No hubo error. Alguna idea?

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
 130
Author: Vini.g.fer, 2015-01-29

10 answers

Un contenedor docker sale cuando finaliza su proceso principal.

En este caso se cerrará cuando finalice el script start-all.sh. No se lo suficiente sobre hadoop como para decirte como hacerlo en este caso, pero necesitas dejar algo corriendo en primer plano o usar un gestor de procesos como runit o supervisord para ejecutar los procesos.

Creo que debe estar equivocado sobre si funciona si no especifica -d; debería tener exactamente el mismo efecto. Sospecho que lo lanzaste. con un comando ligeramente diferente o usando -it que cambiará las cosas.

Una solución simple puede ser agregar algo como:

while true; do sleep 1000; done

Al final del script. Sin embargo, no me gusta esto, ya que el script realmente debería monitorear los procesos que inició.

(Debería decir que robé ese código de https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh )

 82
Author: Adrian Mouat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 11:54:44

Esto hizo el truco para mí:

docker run -dit ubuntu

Después de esto, puedo ver los procesos en ejecución:

docker ps -a

Para volver a colocar el recipiente

docker attach CONTAINER_NAME

CONSEJO: Para salir sin detener el tipo de contenedor: ^P^Q

 124
Author: camposer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-22 09:31:44

Me gustaría ampliar o me atrevo a decir, mejorar la respuesta mencionada por camposer

Cuando corras

docker run -dit ubuntu

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 está funcionando, simplemente bifurcaría otro proceso de bash y obtener un pseudo TTY ejecutando:

docker exec -it <container ID> /bin/bash
 41
Author: Krishna Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:03

Cada vez que quiero que un contenedor permanezca activo después de terminar la ejecución del script agrego

&& tail -f /dev/null

Al final del comando. Así que debería ser:

/usr/local/start-all.sh && tail -f /dev/null
 14
Author: Thiago Ramos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-02 13:20:25

Un buen enfoque sería iniciar sus procesos y servicios ejecutándolos en segundo plano y usar el comando wait [n ...] al final de su script. En bash, el comando wait fuerza el proceso actual a:

Espere cada proceso especificado y devuelva su estado de terminación. Si no se da n, se esperan todos los procesos secundarios actualmente activos, y el estado de retorno es cero.

Tengo esta idea de Sébastien Pujadas' guión de inicio para su alce build .

Tomando de la pregunta original, estás start-all.sh se vería algo como esto...

 #!/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
 11
Author: Brian Olsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-04 22:04:35

Mi práctica está en el Dockerfile iniciar un shell que no saldrá inmediatamente CMD [ "sh", "-c", "service ssh start; bash"], luego ejecutar docker run -dit image_name. De esta manera, el servicio (ssh) y el contenedor están funcionando.

 1
Author: Leon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-17 15:21:52

Añadiendo

Exec "@ @ "

Al final de mi script de shell fue mi solución!

 1
Author: Adam k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 18:31:40

Hay muchas maneras posibles de hacer que una docker salga inmediatamente. Para mí, fue el problema con mi Dockerfile. Había un error en ese archivo. Tenía ENTRYPOINT ["dotnet", "M4Movie_Api.dll] en lugar de ENTRYPOINT ["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 adjunté mi contenedor para poder ver cuál era el problema exacto.

C:\SVenu\M4Movie\Api\Api>docker start 4ea373efa21b


C:\SVenu\M4Movie\Api\Api>docker attach 4ea373efa21b

Donde 4ea373efa21b es mi id de contenedor. Esto me lleva al problema real.

introduzca la descripción de la imagen aquí

Después de encontrar el problema, tuve que compilar, restaurar y publicar mi contenedor de nuevo.

 0
Author: Sibeesh Venu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-09 17:08:50

Puede ejecutar el contenedor usando este indicador de reinicio.

docker run -d --name=<some-name> -p xxxx:xxxx ... <image-name> --restart=unless-stopped
 0
Author: Akmal Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-02 03:24:55

Dado que la imagen es linux, una cosa a comprobar es asegurarse de que cualquier script de shell utilizado en el contenedor tenga finales de línea unix. Si tienen un ^M al final, entonces son finales 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ías tener un error tipográfico del nombre del archivo o algo así. véase https://en.wikipedia.org/wiki/Newline

 -6
Author: dskow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-02 16:06:56