Мені довелося вирішити це негайно і придумати ідею. Роблячи дослідження для цього завдання, я потрапив сюди, тому подумав поділитися своїм рішенням із майбутніми відвідувачами цього допису.
Рішення на основі композиції Docker
Якщо ви використовуєте docker-compose, ви можете перевірити мій POC для синхронізації докера . Я поєднав деякі ідеї в інших питаннях (дякую за це - проголосував).
Основна ідея полягає в тому, що кожен контейнер у композиті має службу діагностики. Виклик цієї служби перевіряє, чи потрібний набір портів відкритий у контейнері, і повертає загальний стан контейнера (WARMUP / RUNNING відповідно до POC). Кожен контейнер також має утиліту, яка перевіряє під час запуску, чи працюють відповідні служби. Тільки тоді контейнер запускається.
У прикладі середовища складання докерів є дві служби 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 ( 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