working_dir start for external_links depends_on compose docker synchronization wait docker-compose

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 predeterminado ENTRYPOINT o CMD porque entrypoint: 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 borra CMD 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?