¿Hay alguna manera de iniciar un shell interactivo en un contenedor usando Docker Compose solamente? He intentado algo como esto, en mi docker-compose.yml:
myapp:
image: alpine:latest
entrypoint: /bin/sh
Cuando comienzo este contenedor usando docker-compose, sale inmediatamente. ¿Hay alguna bandera que pueda agregar al comando de punto de entrada, o como una opción adicional para myapp, para comenzar como shell interactivo?
Sé que hay opciones de comando de Docker nativas para lograr esto, solo tengo curiosidad por saber si es posible usar solo Docker Compose también.
/bin/sh
entrada en su archivo de redacción, ¿qué debe hacer?docker-compose run myapp
?docker-compose run myapp
que no expondrá los puertos. Así que tienes que usarlo,docker-compose run --service-ports myapp
pero aún así no es muy conveniente.entrypoint: /bin/sh
debería serentrypoint: "/bin/sh"
Respuestas:
Debe incluir las siguientes líneas en su docker-compose.yml:
El primero corresponde a
-i
indocker run
y el segundo a-t
.fuente
stdin_open
es el enlace que falta, simplemente por proporcionarme el comportamiento esperado cuando lo adjunto a uno de mis contenedores que ya está ejecutando un shell.docker-compose run <service_name>
docker exec
no funcionará.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
La forma canónica de obtener un shell interactivo con docker-compose es usar:
docker-compose run --rm myapp
Puede configurar
stdin_open: true, tty: true
, sin embargo, eso en realidad no le dará un caparazón adecuadoup
, porque los registros se transmiten desde todos los contenedores.También puedes usar
para obtener un shell en un contenedor en ejecución.
fuente
--service-ports
si expone algún puerto (es decir, para un servidor web)--rm
bandera para que se elimine el contenedor. La respuesta de @ lynx0123 no es correcta. No obtendrá un shell interactivo si ejecutadocker-compose up
.docker-compose run
funciona. También querrás agregarcommand: /bin/bash
a docker-compose.yml.En el ejemplo oficial de inicio ( https://docs.docker.com/compose/gettingstarted/ ) con lo siguiente
docker-compose.yml
:Después de comenzar con esto
docker-compose up
, puede cambiar fácilmente a suredis
contenedor o suweb
contenedor con:fuente
docker-compose run myapp sh
Debería hacer el trato.Existe cierta confusión con
up
/run
, pero losdocker-compose run
documentos tienen una gran explicación: https://docs.docker.com/compose/reference/runfuente
Usando docker-compose, encontré que la forma más fácil de hacer esto es hacer un
docker ps -a
(después de comenzar con mis contenedoresdocker-compose up
) y obtener la ID del contenedor en el que quiero tener un shell interactivo (llamémoslo xyz123).Entonces es un asunto simple de ejecutar
docker exec -ti xyz123 /bin/bash
y voila, un caparazón interactivo.
fuente
Si alguien del futuro también deambula por aquí:
o
o puedes correr líneas simples como
Eso es después de que ya tienes tus contenedores en funcionamiento
fuente
Puedes hacerlo
docker-compose exec SERVICE_NAME sh
en la línea de comando. ElSERVICE_NAME
se define en sudocker-compose.yml
. Por ejemplo,El
SERVICE_NAME
sería "cuidador del zoológico".fuente
Esta pregunta es muy interesante para mí porque tengo problemas, cuando ejecuto el contenedor después de que finaliza la ejecución, salgo inmediatamente y lo solucioné con -it:
Y cuando debo automatizarlo con Docker compose:
Esto hace el truco: stdin_open: true, tty: true
Este es un proyecto generado con create-react-app
Dockerfile.dev se ve esto que:
Espero que este ejemplo ayude a otros a ejecutar una interfaz (reaccionar en el ejemplo) en el contenedor docker.
fuente
Si
yml
se llama,docker-compose.yml
se puede iniciar con un simple$ docker-compose up
. La conexión correspondiente de un terminal puede ser simplemente (considere queyml
ha especificado un servicio llamadomyservice
):Sin embargo, si está usando un
yml
nombre de archivo diferente , por ejemplodocker-compose-mycompose.yml
, debe iniciarse usando$ docker-compose -f docker-compose-mycompose.yml up
. Para adjuntar un terminal interactivo, también debe especificar elyml
archivo, como:fuente