Estoy tratando de usar docker-compose para abrir un contenedor. Como ENTRYPOINT , ese contenedor tiene un script bash simple que escribí. Ahora, cuando trato de abrir el contenedor de cualquiera de las siguientes maneras:
docker-compose up
docker-compose up foo
no se completa es decir, intentar adjuntar ( docker exec -i -t $1 /bin/bash
) al contenedor en ejecución, falla con:
Respuesta de error del daemon: el contenedor xyz se está reiniciando, espere hasta que el contenedor se esté ejecutando.
Intenté jugar con poner comandos en segundo plano. Eso no funcionó.
mi-script.sh
cmd1 & cmd2 && ... cmdn &
También probé i) con y sin entrypoint: /bin/sh /usr/local/bin/my-script.sh
y ii) con y sin la opción tty: true
. No dados.
docker-compose.yml
version: '2' services: foo: build: context: . dockerfile: Dockerfile.foo ... tty: true entrypoint: /bin/sh /usr/local/bin/my-script.sh
También probé solo un ciclo manual de compilación/ejecución de la ventana acoplable. Y (sin iniciar /bin/sh
en ENTRYPOINT ) la ejecución simplemente sale.
$ docker build ... . $ docker run -it ... ... shell echos commands here, then exits $
Estoy seguro de que es algo simple. ¿Cuál es la solución aquí?
Su punto de entrada en su docker-compose.yml
entrypoint
necesita ser
entrypoint: /usr/local/bin/my-script.sh
¡Solo agrega #! /bin/sh
en la parte superior de la secuencia de comandos para especificar el shell que desea utilizar.
También debe agregar exec "$@"
al final de su secuencia de comandos de punto de entrada o, de lo contrario, se cerrará de inmediato, lo que terminará el contenedor.
En primer lugar, debe poner algo infinito para seguir ejecutando su contenedor en segundo plano, como puede hacer tail -f application.log
o algo así para que, incluso si sale de su contenedor bash, siga ejecutándose en segundo plano.
no necesita hacer cmd1 & cmd2 &&...cmdn &
simplemente coloque un comando como este touch 1.txt && tail -f 1.txt
como último paso en su my-script.sh
. Seguirá ejecutando su contenedor. Una cosa que también debe cambiar es docker run -it -d
-d
iniciará el contenedor con el modo de fondo. Si desea ingresar a su contenedor, entonces docker exec -it container_name/id bash
depura el problema y sale. su contenedor se ejecuta hasta que se detiene con docker stop container_id/name
Espero que esto ayude. ¡Gracias!