Musiałem sobie z tym poradzić i wpadłem na pewien pomysł. Robiąc badania związane z tym zadaniem, dostałem tutaj, więc pomyślałem, że podzielę się moim rozwiązaniem z przyszłymi odwiedzającymi ten post.
Rozwiązanie oparte na Docker Compose
Jeśli używasz docker-compose, możesz sprawdzić mój POC synchronizacji docker . Część pomysłów połączyłem w innych pytaniach (dzięki za to - zaopracowano).
Podstawową ideą jest to, że każdy kontener w kompozycie udostępnia usługę diagnostyczną. Wywołanie tej usługi sprawdza, czy wymagany zestaw portów jest otwarty w kontenerze i zwraca ogólny stan kontenera (WARMUP / RUNNING zgodnie z POC). Każdy kontener ma również narzędzie do sprawdzania po uruchomieniu, czy usługi zależne działają. Dopiero wtedy kontener się uruchamia.
W przykładowym środowisku docker-compose są dwie usługi serwer1 i serwer2 oraz usługa klienta , która czeka na uruchomienie obu serwerów, a następnie wysyła żądanie do obu z nich i kończy pracę.
Wyciąg z 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
Czekam na wiele kontenerów:
trap 'kill $(jobs -p)' EXIT
for server in $DEPENDS_ON
do
/assets/wait_for_server.sh $server &
wait $!
done
Podstawowa implementacja usługi diagnostycznej ( 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";
Podłączanie usługi diagnostycznej do portu:
nc -v -lk -p 7070 -e /assets/checkports.sh