¿Cómo puedo hacer que mi Docker redacte el guión de "espera por él" para invocar el contenedor original ENTRYPOINT o CMD?
De acuerdo aControl de orden de inicio en Componer, uno puede controlar el orden en queDocker Compose inicia contenedores utilizando un "esperar"script. Scriptwait-for-it.sh
espera tanto unhost:port
argumento y el comando que el script debe ejecutar cuando el puerto esté disponible. La documentación recomienda que Docker Compose invoque este script utilizando elentrypoint:
opción. Sin embargo, si uno usa esta opción, el contenedor ya no ejecutará su valor predeterminadoENTRYPOINT
oCMD
porqueentrypoint:
anula el valor predeterminado.
¿Cómo podría uno proporcionar este comando predeterminado await-for-it.sh
para que el script pueda invocar el valor predeterminadoENTRYPOINT
oCMD
cuando se cumple la condición por la que espera?
En mi caso, he implementado un scriptwait-for-file.sh
que sondea esperando 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 invocawait-for-file.sh
como punto de entrada a un contenedor ligeramente personalizado derivado detomcat: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 salir con éxito, otro contenedor personalizadoliquibase
crea/var/run/liquibase/done
y entoncesplatinum-oms
efectivamente espera contenedorliquibase
completar.
Una vez contenedorliquibase
crea un archivo/var/run/liquibase/done
, wait-for-file.sh
huellas dactilaresFound file [/var/run/liquibase/done].
, pero no puede invocar el comando predeterminadocatalina.sh run
en contenedor basetomcat:8-jre8
. ¿Por qué?
Creé un escenario de prueba simplificadodocker-compose-wait-for-file
para demostrar mi problema Envaseubuntu-wait-for-file
espera contenedorubuntu-create-file
para crear un archivo/wait/done
y luego yoesperar envaseubuntu-wait-for-file
para invocar el valor predeterminadoubuntu
comando contenedor/bin/bash
, pero en cambio, sale. ¿Por qué no funciona como esperaba?