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
ENTRYPOINTpredeterminadoENTRYPOINToCMDporqueentrypoint: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.ymlborraCMDdefinido 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?