¿Cómo mantener el contenedor Docker en ejecución después de iniciar los servicios?
He visto muchos tutoriales que parecen hacer lo mismo que yo intento hacer, pero por alguna razón mis contenedores Docker salen. Básicamente, estoy configurando un servidor web y algunos demonios dentro de un contenedor Docker. Hago las partes finales de esto a través de un script bash llamado run-all.sh
que ejecuto a través de CMD en mi Dockerfile. run-all.sh
Se ve como esto:
service supervisor start
service nginx start
Y lo inicio dentro de mi Dockerfile de la siguiente manera:
CMD ["sh", "/root/credentialize_and_run.sh"]
Puedo ver que todos los servicios se inician correctamente cuando ejecuto las cosas manualmente (es decir, accedo a la imagen con -i -t /bin/bash), y todo parece funcionar correctamente cuando ejecuto la imagen, pero sale una vez. termina de iniciar mis procesos. Me gustaría que los procesos se ejecuten indefinidamente y, hasta donde tengo entendido, el contenedor debe seguir ejecutándose para que esto suceda. Sin embargo, cuando ejecuto docker ps -a
, veo:
➜ docker_test docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7706edc4189 some_name/some_repo:blah "sh /root/run-all.sh 8 minutes ago Exited (0) 8 minutes ago grave_jones
¿Lo que da? ¿Por qué sale? Sé que podría poner un bucle while al final de mi script bash para mantenerlo, pero ¿cuál es la forma correcta de evitar que salga?
Si está utilizando un Dockerfile, intente:
ENTRYPOINT ["tail", "-f", "/dev/null"]
(Obviamente, esto es solo para fines de desarrollo, no debería necesitar mantener activo un contenedor a menos que esté ejecutando un proceso, por ejemplo, nginx...)
Tuve el mismo problema y descubrí que si ejecuta su contenedor con la bandera -t
y -d
, continúa ejecutándose.
docker run -td <image>
Esto es lo que hacen las banderas (según docker run --help
):
-d, --detach=false Run container in background and print container ID
-t, --tty=false Allocate a pseudo-TTY
El más importante es la -t
bandera. -d
solo te permite ejecutar el contenedor en segundo plano.