私はこれにしっかりと取り組み、アイデアを思いついた。このタスクの調査をしているときに私はここに着いたので、この投稿の将来の訪問者と私の解決策を共有したいと思いました。
Docker-composeベースのソリューション
docker-composeを使用している場合は、docker同期POCを確認できます。私は他の質問でいくつかのアイデアを組み合わせました(そのおかげで-賛成)。
基本的な考え方は、コンポジット内のすべてのコンテナーが診断サービスを公開することです。このサービスを呼び出すと、必要なポートのセットがコンテナで開いているかどうかが確認され、コンテナの全体的なステータスが返されます(POCに従ってWARMUP / RUNNING)。各コンテナには、起動時に依存サービスが稼働しているかどうかを確認するユーティリティもあります。その後、コンテナが起動します。
docker-compose環境の例では、server1とserver2の2つのサービスがあり、両方のサーバーが起動するのを待ってから両方にリクエストを送信して終了するクライアントサービスがあります。
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
複数のコンテナを待っています:
trap 'kill $(jobs -p)' EXIT
for server in $DEPENDS_ON
do
/assets/wait_for_server.sh $server &
wait $!
done
診断サービスの基本的な実装(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";
診断サービスをポートに配線する:
nc -v -lk -p 7070 -e /assets/checkports.sh