Antecedentes
Un contenedor Docker ejecuta un proceso (el "comando" o "punto de entrada") que lo mantiene vivo. El contenedor continuará ejecutándose mientras el comando continúe ejecutándose.
En su caso, el comando ( /bin/bash
, por defecto, encentos:latest
) sale inmediatamente (como lo hace bash cuando no está conectado a un terminal y no tiene nada que ejecutar).
Normalmente, cuando ejecuta un contenedor en modo demonio (con -d
), el contenedor ejecuta algún tipo de proceso de demonio (comohttpd
). En este caso, mientras el demonio httpd se esté ejecutando, el contenedor permanecerá vivo.
Lo que parece estar intentando hacer es mantener vivo el contenedor sin que se ejecute un proceso demonio dentro del contenedor. Esto es algo extraño (porque el contenedor no está haciendo nada útil hasta que interactúa con él, tal vez condocker exec
), pero hay ciertos casos en los que podría tener sentido hacer algo como esto.
(¿Querías llegar a un aviso de bash dentro del contenedor? ¡Eso es fácil! docker run -it centos:latest
)
Solución
Una manera simple de mantener un contenedor vivo en modo demonio indefinidamente es ejecutarlo sleep infinity
como el comando del contenedor. Esto no depende de hacer cosas extrañas como asignar un TTY en modo demonio. Aunque se basa en hacer cosas extrañas como usarlo sleep
como su comando principal.
$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d651c7a9e0ad centos:latest "sleep infinity" 2 seconds ago Up 2 seconds nervous_visvesvaraya
Solución alternativa
Como lo indica cjsimon, la -t
opción asigna un "pseudo-tty". Estos trucos hacen que continúe ejecutándose indefinidamente porque cree que está conectado a un TTY interactivo (aunque no tenga forma de interactuar con ese TTY en particular si no lo aprueba -i
). De todos modos, esto también debería hacer el truco:
$ docker run -t -d centos:latest
No estoy 100% seguro de si -t
producirá otras interacciones extrañas; tal vez deje un comentario a continuación si lo hace.