이 문제를 해결해야했고 아이디어가 떠 올랐습니다. 이 작업에 대한 조사를 할 때 여기에 왔기 때문에이 게시물의 향후 방문자와 내 솔루션을 공유 할 것이라고 생각했습니다.
Docker 작성 기반 솔루션
docker-compose를 사용하는 경우 내 도커 동기화 POC를 확인할 수 있습니다 . 나는 다른 질문에서 몇 가지 아이디어를 결합했습니다 (감사합니다-upvoted).
기본 아이디어는 컴포지트의 모든 컨테이너가 진단 서비스를 노출한다는 것입니다. 이 서비스를 호출하면 필요한 포트 집합이 컨테이너에 열려 있는지 확인하고 컨테이너의 전체 상태를 반환합니다 (POC에 따라 WARMUP / RUNNING). 각 컨테이너에는 시작시 종속 서비스가 실행 중인지 확인하는 유틸리티도 있습니다. 그런 다음 컨테이너가 시작됩니다.
예시 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
진단 서비스 기본 구현 ( 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