Ich musste das frühzeitig angehen und kam auf eine Idee. Als ich für diese Aufgabe recherchierte, kam ich hierher und dachte, ich würde meine Lösung mit zukünftigen Besuchern dieses Beitrags teilen.
Docker-Compose-basierte Lösung
Wenn Sie Docker-Compose verwenden, können Sie meinen Docker-Synchronisations-POC überprüfen . Ich habe einige der Ideen in anderen Fragen kombiniert (danke dafür - positiv bewertet).
Die Grundidee ist, dass jeder Container im Verbund einen Diagnosedienst bereitstellt. Durch Aufrufen dieses Dienstes wird überprüft, ob der erforderliche Satz von Ports im Container geöffnet ist, und der Gesamtstatus des Containers zurückgegeben (WARMUP / RUNNING gemäß POC). Jeder Container verfügt außerdem über ein Dienstprogramm, mit dem beim Start überprüft werden kann, ob die abhängigen Dienste ausgeführt werden. Erst dann startet der Container.
In der Beispiel-Docker-Compose-Umgebung gibt es zwei Dienste, Server1 und Server2, und der Client- Dienst, der auf den Start beider Server wartet und dann eine Anforderung an beide sendet und beendet.
Auszug aus dem 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
Warten auf mehrere Container:
trap 'kill $(jobs -p)' EXIT
for server in $DEPENDS_ON
do
/assets/wait_for_server.sh $server &
wait $!
done
Grundlegende Implementierung von Diagnostic srervice ( 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";
Verdrahtung des Diagnosedienstes mit einem Port:
nc -v -lk -p 7070 -e /assets/checkports.sh