Ho dovuto affrontarlo di recente e mi è venuta un'idea. Durante la ricerca per questo compito sono arrivato qui, quindi ho pensato di condividere la mia soluzione con i futuri visitatori di questo post.
Soluzione basata su Docker-compose
Se stai usando docker-compose puoi controllare il mio POC di sincronizzazione docker . Ho combinato alcune delle idee in altre domande (grazie per questo - voto positivo).
L'idea di base è che ogni contenitore nel composito esponga un servizio diagnostico. La chiamata a questo servizio controlla se il set di porte richiesto è aperto nel container e restituisce lo stato generale del container (WARMUP / RUNNING secondo il POC). Ogni contenitore dispone inoltre di un'utilità per verificare all'avvio se i servizi dipendenti sono attivi e in esecuzione. Solo allora il contenitore si avvia.
Nell'ambiente docker-compose di esempio sono presenti due servizi server1 e server2 e il servizio client che attende l'avvio di entrambi i server, quindi invia una richiesta a entrambi ed esce.
Estratto dal 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
In attesa di più contenitori:
trap 'kill $(jobs -p)' EXIT
for server in $DEPENDS_ON
do
/assets/wait_for_server.sh $server &
wait $!
done
Implementazione di base del servizio diagnostico ( 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";
Collegamento del servizio di diagnostica a una porta:
nc -v -lk -p 7070 -e /assets/checkports.sh