De acuerdo con el tutorial que leí hasta ahora, el uso " docker run -d
" iniciará un contenedor desde la imagen y el contenedor se ejecutará en segundo plano. Así es como se ve, podemos ver que ya tenemos la identificación del contenedor.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Pero si corrí " docker ps
", no se devolvió nada.
Así que probé " docker ps -a
", puedo ver que el contenedor ya salió:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
¿Algo que hice mal? ¿Cómo puedo solucionar este problema?
docker run -it -d <image> /bin/bash
esto inicia un shell bash de forma interactiva y no cierra el contenedor porque el proceso del shell está activo.Respuestas:
El centos dockerfile tiene un comando predeterminado
bash
.Eso significa que, cuando se ejecuta en segundo plano (
-d
), el shell sale inmediatamente.Actualización 2017
Las versiones más recientes de Docker autorizan a ejecutar un contenedor tanto en modo separado como en modo de primer plano (
-t
,-i
o-it
)En ese caso, no necesita ningún comando adicional y esto es suficiente:
La fiesta esperará en el fondo.
Que se informó inicialmente en kalyani-chaudhari 's respuesta y detallados en frijol maillot ' s respuesta .
Tenga en cuenta que para alpine , Marinos An informa en los comentarios :
Respuesta original (2015)
Como se menciona en este artículo :
Entonces esto funcionaría:
UNA
docker ps
mostraría que el contenedor de centos sigue funcionando.Desde allí, puede adjuntarlo o desconectarlo (o
docker exec
algunos comandos).fuente
docker exec -it <yourContainer> bash
.Según esta respuesta , agregar la
-t
bandera evitará que el contenedor salga cuando se ejecute en segundo plano. Luego puede usardocker exec -i -t <image> /bin/bash
para ingresar a un indicador de comandos de shell.Parece que la opción -t no está muy bien documentada , aunque la ayuda dice que "asigna un pseudo-TTY".
fuente
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- no funciona para mí (ubuntu 14.04.5): ESTADO = Salido (1) hace 4 segundosAntecedentes
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 con
docker 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 usarlosleep
como su comando principal.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:No estoy 100% seguro de si
-t
producirá otras interacciones extrañas; tal vez deje un comentario a continuación si lo hace.fuente
infinity
.Hola, este problema se debe a que los contenedores de Docker salen si no hay una aplicación en ejecución en el contenedor.
La opción es simplemente ejecutar un contenedor en modo deamon.
Entonces, el truco para hacer que su contenedor se ejecute continuamente es apuntar a un archivo de shell en Docker que mantendrá su aplicación en funcionamiento. Puede intentar con un archivo start.sh
Este start.sh debería apuntar a una aplicación interminable.
En caso de que no desee que se ejecute ninguna aplicación, puede instalar
monit
que mantendrá su contenedor Docker en ejecución. Háganos saber si estos dos casos funcionaron para usted para mantener su contenedor en funcionamiento.Todo lo mejor
fuente
Puedes lograr lo que quieres con:
o
o
El parámetro de comando sugerido por otras respuestas (es decir, tail -f / dev / null) es completamente opcional y NO es necesario para que su contenedor permanezca funcionando en segundo plano.
También tenga en cuenta que la documentación de Docker sugiere que la combinación de las opciones -i y -t hará que se comporte como un shell.
Ver:
https://docs.docker.com/engine/reference/run/#foreground
fuente
Tengo este fragmento de código ejecutado
ENTRYPOINT
en mi archivo acoplable:Ejecute la imagen incorporada del acoplador como:
Inicie sesión en el shell del contenedor:
fuente
ejecutar el comando de la siguiente manera:
si desea especificar el puerto, entonces comience de la siguiente manera:
Verifique el contenedor en ejecución con el siguiente comando:
fuente
-t -d
vs-i -d
? Ambos mantendrán el contenedor en funcionamiento.Docker requiere su comando para seguir ejecutándose en primer plano. De lo contrario, cree que sus aplicaciones se detienen y apagan el contenedor.
Entonces, si su script de entrada de Docker es un proceso en segundo plano como el siguiente:
El '&' hace que el contenedor se detenga y salga si no hay otro proceso de primer plano activado más tarde. Entonces, la solución es simplemente eliminar el '&' o tener otro CMD en primer plano ejecutándose después , como
fuente
touch
ese archivo primero, en caso de que no pueda encontrar un archivo de registro.El contenedor Docker se cierra si se realiza la tarea en el interior, por lo que si desea mantenerlo vivo incluso si no tiene ningún trabajo o ya los terminó, puede hacerlo
docker run -di image
. Después de que lo hagasdocker container ls
, lo verás en ejecución.fuente
Tal vez soy solo yo, pero en CentOS 7.3.1611 y Docker 1.12.6, pero terminé teniendo que usar una combinación de las respuestas publicadas por @VonC y @Christopher Simon para que esto funcione de manera confiable. Nada de lo que hice antes impedirá que el contenedor salga después de ejecutar CMD con éxito. Estoy iniciando oracle-xe-11Gr2 y sshd.
Dockerfile
Luego agregue -d -t y -i para ejecutar
Finalmente después de horas de golpear mi cabeza contra la pared
Por alguna razón, lo anterior se cerrará después de ejecutar CMD si se elimina la cola -f, o si se omite cualquiera de las opciones -t -d -i.
fuente
Lo he explicado en la siguiente publicación que tiene la misma pregunta.
¿Cómo retener el contenedor alpino docker después de usar la "salida"?
fuente
Tuve el mismo problema, solo abrir otra terminal con un golpe me funcionó:
crear contenedor:
iniciar contenedor:
iniciar bash para mantener el contenedor en funcionamiento:
proceso de inicio que necesita:
fuente
Si está utilizando CMD al final de su Dockerfile, lo que puede hacer es agregar el código al final. Esto solo funcionará si su docker está construido en ubuntu o en cualquier sistema operativo que pueda usar bash.
Brevemente, el final de su Dockerfile se verá así.
Entonces, si tiene algo ejecutándose automáticamente después de ejecutar la imagen de su ventana acoplable, y cuando se complete la tarea, el terminal bash estará activo dentro de su ventana acoplable. De este modo, puede ingresar sus comandos de shell.
fuente
Ejecutar Docker con modo interactivo podría resolver el problema.
Aquí está el ejemplo para ejecutar imágenes con y sin modo interactivo
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID DE CONTENEDOR MANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID DE CONTENEDOR MANDO DE IMAGEN ESTADO CREADO PUERTOS NOMBRES c3d6a9529fd7 test_again1.0 "bash" hace 2 segundos Subir 1 segundo awesome_haibt
fuente
Si desea operar en el contenedor, debe ejecutarlo en primer plano para mantenerlo vivo.
fuente
El orden de los argumentos es importante
La respuesta de Jersey Beans (los 3 ejemplos) funcionó para mí. Después de bastante prueba y error, me di cuenta de que el orden de los argumentos es importante.
Mantiene el contenedor ejecutándose en segundo plano:
docker run -t -d <image-name>
Mantiene el contenedor ejecutándose en primer plano:
docker run <image-name> -t -d
No era obvio para mí venir de un fondo Powershell.
fuente