Мне пришлось решить эту проблему недавно, и в голову пришла идея. Изучая эту задачу, я попал сюда, поэтому решил поделиться своим решением с будущими посетителями этого поста.
Решение на основе Docker-compose
Если вы используете docker-compose, вы можете проверить мой POC синхронизации докеров . Я объединил некоторые идеи в других вопросах (спасибо за это - проголосовали за).
Основная идея состоит в том, что каждый контейнер в композите предоставляет диагностический сервис. Вызов этой службы проверяет, открыт ли требуемый набор портов в контейнере, и возвращает общий статус контейнера (WARMUP / 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
Базовая реализация диагностического сервиса ( 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