Я создал тестовый форум с двумя контейнерами web_only, контейнером mail-receiver, Postgres и Redis в одной Docker-сети. Два веб-контейнера с nginx были выведены через HAProxy. Они работали хорошо, но при пересборке одного из двух веб-контейнеров я всегда наблюдал небольшой простой, в течение которого возвращалась ошибка 503.
К счастью, я нашел обходное решение, хотя оно и не идеальное;
перед пересборкой app1 выполните
echo "disable server be_discourse/app1" | socat stdio /run/haproxy/admin.sock
а после завершения процесса пересборки app1 выполните
echo "enable server be_discourse/app1" | socat stdio /run/haproxy/admin.sock
Аналогично, для пересборки app2 выполните
echo "disable server be_discourse/app2" | socat stdio /run/haproxy/admin.sock
а после завершения процесса пересборки app2 выполните
echo "enable server be_discourse/app2" | socat stdio /run/haproxy/admin.sock
это основано на соответствии
/etc/haproxy/haproxy.cfgотносительноbe_discourse. Я пока не буду вставлять файл конфигурации в блок кода, но если наберется достаточное количество желающих, я это сделаю.
Таким образом, дополнительные команды предотвращают появление 503, сообщая HAProxy перенаправить трафик до того, как он обнаружит, что от неработающего контейнера будет возвращена ошибка 503.
В качестве альтернативы можно создать страницу ошибки, но у меня не очень хорошо получилось с этим, и я считаю, что здесь нужны дополнительные исследования. Однако это не решает проблему простоя.