¿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/shentrada en su archivo de redacción, ¿qué debe hacer?docker-compose run myapp?docker-compose run myappque no expondrá los puertos. Así que tienes que usarlo,docker-compose run --service-ports myapppero aún así no es muy conveniente.entrypoint: /bin/shdebería serentrypoint: "/bin/sh"Respuestas:
Debe incluir las siguientes líneas en su docker-compose.yml:
El primero corresponde a
-iindocker runy el segundo a-t.fuente
stdin_openes 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 execno funcionará.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null characterLa forma canónica de obtener un shell interactivo con docker-compose es usar:
docker-compose run --rm myappPuede 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-portssi expone algún puerto (es decir, para un servidor web)--rmbandera para que se elimine el contenedor. La respuesta de @ lynx0123 no es correcta. No obtendrá un shell interactivo si ejecutadocker-compose up.docker-compose runfunciona. También querrás agregarcommand: /bin/basha 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 surediscontenedor o suwebcontenedor con:fuente
docker-compose run myapp shDebería hacer el trato.Existe cierta confusión con
up/run, pero losdocker-compose rundocumentos 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/bashy 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 shen la línea de comando. ElSERVICE_NAMEse define en sudocker-compose.yml. Por ejemplo,El
SERVICE_NAMEserí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
ymlse llama,docker-compose.ymlse puede iniciar con un simple$ docker-compose up. La conexión correspondiente de un terminal puede ser simplemente (considere queymlha especificado un servicio llamadomyservice):Sin embargo, si está usando un
ymlnombre 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 elymlarchivo, como:fuente