मुझे इस पुनरावृत्ति से निपटना था और एक विचार आया। जब मैं इस कार्य के लिए शोध कर रहा था, तो मैंने सोचा कि मैं इस पोस्ट के भविष्य के आगंतुकों के साथ अपना समाधान साझा करूंगा।
डॉकर-रचना-आधारित समाधान
यदि आप docker- रचना का उपयोग कर रहे हैं, तो आप मेरे docker सिंक्रोनाइज़ेशन POC की जाँच कर सकते हैं । मैंने अन्य प्रश्नों में कुछ विचारों को संयुक्त किया (इसके लिए धन्यवाद - उत्थित)।
मूल विचार यह है कि समग्र में प्रत्येक कंटेनर एक नैदानिक सेवा को उजागर करता है। इस सेवा को कॉल करना यह जांचता है कि पोर्ट में आवश्यक सेट कंटेनर में खुला है या कंटेनर की समग्र स्थिति (WOCUP / RUNNING POC के अनुसार) वापस कर देता है। प्रत्येक कंटेनर में स्टार्टअप पर जांच करने की एक उपयोगिता भी होती है, यदि आश्रित सेवाएँ ऊपर और चल रही हों। तभी कंटेनर स्टार्ट होता है।
उदाहरण के लिए docker-compose वातावरण में दो सेवाएँ server1 और server2 हैं और क्लाइंट सेवा जो दोनों सर्वरों के शुरू होने का इंतजार करती है, फिर उन दोनों को अनुरोध भेजती है और बाहर निकल जाती है।
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
नैदानिक 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";
एक पोर्ट के लिए नैदानिक सेवा तारों:
nc -v -lk -p 7070 -e /assets/checkports.sh