Tuve que abordar esto recientemente y se me ocurrió una idea. Al hacer una investigación para esta tarea, llegué aquí, así que pensé en compartir mi solución con los futuros visitantes de esta publicación.
Solución basada en Docker compose
Si está utilizando docker-compose, puede consultar mi POC de sincronización de docker . Combiné algunas de las ideas en otras preguntas (gracias por eso, voté a favor).
La idea básica es que cada contenedor del compuesto expone un servicio de diagnóstico. Llamar a este servicio verifica si el conjunto de puertos requerido está abierto en el contenedor y devuelve el estado general del contenedor (WARMUP / RUNNING según el POC). Cada contenedor también tiene una utilidad para verificar al inicio si los servicios dependientes están en funcionamiento. Solo entonces se pone en marcha el contenedor.
En el entorno docker-compose de ejemplo, hay dos servicios server1 y server2 y el servicio de cliente que espera que ambos servidores se inicien y luego envía una solicitud a ambos y sale.
Extracto del POC
wait_for_server.sh
#!/bin/bash
server_host=$1
sleep_seconds=5
while true; do
echo -n "Checking $server_host status... "
output=$(echo "" | nc $server_host 7070)
if [ "$output" == "RUNNING" ]
then
echo "$server_host is running and ready to process requests."
break
fi
echo "$server_host is warming up. Trying again in $sleep_seconds seconds..."
sleep $sleep_seconds
done
Esperando varios contenedores:
trap 'kill $(jobs -p)' EXIT
for server in $DEPENDS_ON
do
/assets/wait_for_server.sh $server &
wait $!
done
Implementación básica del servicio de diagnóstico ( checkports.sh ):
#!/bin/bash
for port in $SERVER_PORT; do
nc -z localhost $port;
rc=$?
if [[ $rc != 0 ]]; then
echo "WARMUP";
exit;
fi
done
echo "RUNNING";
Cableado del servicio de diagnóstico a un puerto:
nc -v -lk -p 7070 -e /assets/checkports.sh