start - ¿Cómo puedo hacer que mi Docker componga el script "wait-for-it" invoque el contenedor original ENTRYPOINT o CMD?
docker compose working_dir (1)
Sin embargo, si uno usa esta opción, el contenedor ya no ejecutará su
ENTRYPOINT
predeterminadoENTRYPOINT
oCMD
porqueentrypoint:
anula el valor predeterminado.
Eso es lo que se espera, por lo que la wait-for-it
se presenta como un script de envoltura .
Sin embargo, permite ejecutar un "subcomando":
wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
^^^^^^^^^^^^
El subcomando se ejecutará independientemente de si el servicio está activo o no.
Si desea ejecutar el subcomando solo si el servicio está activo, agregue el argumento--strict
.
Eso significa que la parte CMD
de su imagen se puede usar para su comando de contenedor real, ya que sus parámetros pasarán en parámetros al comando ENTRYPOINT
:
entrypoint: wait-for-it.sh host:port --
cmd: mycmd myargs
Esto debería funcionar ... excepto por el problema 3140 de la docker-compose
(mencionado por el en los comentarios )
punto de entrada definido en
docker-compose.yml
borraCMD
definido en Dockerfile
De acuerdo con Controlar el orden de inicio en Redactar , se puede controlar el orden en el que Docker Compose inicia los contenedores mediante el uso de una secuencia de comandos de " wait-for-it ". El script wait-for-it.sh
espera tanto un argumento host:port
como el comando que el script debe ejecutar cuando el puerto esté disponible. La documentación recomienda que Docker Compose invoque este script mediante la opción entrypoint:
. Sin embargo, si uno usa esta opción, el contenedor ya no ejecutará su ENTRYPOINT
o CMD
predeterminado porque entrypoint:
anula el valor predeterminado.
¿Cómo podría uno proporcionar este comando predeterminado a wait-for-it.sh
para que el script pueda invocar el ENTRYPOINT
o CMD
predeterminado cuando se cumpla la condición por la que espera?
En mi caso, he implementado un script wait-for-file.sh
que sondea en espera de que exista un archivo:
#!/bin/bash
set -e
waitFile="$1"
shift
cmd="$@"
until test -e $waitFile
do
>&2 echo "Waiting for file [$waitFile]."
sleep 1
done
>&2 echo "Found file [$waitFile]."
exec $cmd
Docker Compose invoca wait-for-file.sh
como punto de entrada a un contenedor ligeramente personalizado derivado de tomcat:8-jre8
:
platinum-oms:
image: opes/platinum-oms
ports:
- "8080:8080"
volumes_from:
- liquibase
links:
- postgres:postgres
- activemq:activemq
depends_on:
- liquibase
- activemq
entrypoint: /wait-for-file.sh /var/run/liquibase/done
Antes de que salga con éxito, otro contenedor personalizado liquibase
crea /var/run/liquibase/done
y, por lo tanto, platinum-oms
espera efectivamente a que se complete el liquibase
contenedor.
Una vez que el contenedor liquibase
crea el archivo /var/run/liquibase/done
, wait-for-file.sh
imprime el Found file [/var/run/liquibase/done].
, pero no puede invocar el comando predeterminado catalina.sh run
en el contenedor base tomcat:8-jre8
. ¿Por qué?
Escenario de prueba
Creé un caso de prueba simplificado docker-compose-wait-for-file
para demostrar mi problema. El contenedor ubuntu-wait-for-file
espera que el contenedor ubuntu-create-file
cree el archivo /wait/done
y luego espero que el contenedor ubuntu-wait-for-file
invoque el comando predeterminado de ubuntu
container /bin/bash
, pero en su lugar, sale. ¿Por qué no funciona como espero?