shell - script - que es docker compose
Shell interactivo con Docker Compose (7)
¿Hay alguna manera de iniciar un shell interactivo en un contenedor usando Docker Compose únicamente? 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 iniciar 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.
Debe incluir las siguientes líneas en su docker-compose.yml:
stdin_open: true
tty: true
El primero corresponde a
-i
en
docker run
y el segundo a
-t
.
En el ejemplo oficial de inicio (
https://docs.docker.com/compose/gettingstarted/
) con el siguiente
docker-compose.yml
:
version: ''3''
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
Después de comenzar esto con
docker-compose up
, puede fácilmente
redis
su contenedor
redis
o su contenedor
web
con:
docker-compose exec redis sh
docker-compose exec web sh
La forma canónica de obtener un shell interactivo con docker-compose es usar:
docker-compose run --rm myapp
Puede establecer
stdin_open: true, tty: true
, sin embargo, eso en realidad no le dará un shell adecuado con
up
, porque los registros se transmiten desde todos los contenedores.
También puedes usar
docker exec -ti <container name> /bin/bash
para obtener un shell en un contenedor en ejecución.
Puede hacer
docker-compose exec SERVICE_NAME sh
en la línea de comando.
SERVICE_NAME
se define en su
docker-compose.yml
.
Por ejemplo,
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
SERVICE_NAME
sería "zookeeper".
Si alguien del futuro también se pregunta aquí:
docker-compose exec container_name sh
o
docker-compose exec container_name bash
o puedes correr líneas simples como
docker-compose exec container_name php -v
Eso es después de que ya tienes tus contenedores en funcionamiento
Usando docker-compose, encontré que la forma más fácil de hacer esto es hacer un
docker ps -a
(después de comenzar mis contenedores con
docker-compose up
) y obtener la ID del contenedor en el que quiero tener un shell interactivo (llamemos es xyz123).
Entonces es simple ejecutar
docker exec -ti xyz123 /bin/bash
y voila, un caparazón interactivo.
docker-compose run myapp sh
debería hacer el trato.
Existe cierta confusión con
up
/
run
, pero los documentos de
docker-compose run
tienen una gran explicación:
https://docs.docker.com/compose/reference/run