Я пытаюсь запустить тесты моего приложения с помощью docker-compose, но получаю случайные ошибки «Сброс соединения по одноранговым узлам», когда один контейнер пытается выполнить HTTP-вызов другому контейнеру в той же сети.
У меня есть следующий фрагмент кода в контейнере A:
session = requests.session()
while True:
session.get("http://container-b:3171/health/")
Это вызывает фиктивную конечную точку в контейнере B, которая просто возвращает HTTP 200. Контейнер B является приложением Python, обслуживаемым uWSGI.
Этот цикл выполняется около 1000 раз, а затем происходит сбой со следующей ошибкой:
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
Что я нашел до сих пор:
Эта проблема, кажется,связано с тем, как docker-compose настраивает сеть. Если я связываю контейнер B с локальным портом и меняю код на вызов localhost
вместо container-b
, проблема исчезает:
session = requests.session()
while True:
# use "localhost" instead of the "container-b" docker-compose alias
session.get("http://localhost:3171/health/")
Я также заметил, что проблема не возникнет, если я наденуне использует запросы Session
object:
def test_bli():
while True:
requests.get("http://stub-server:3171/health/")
Сеанс сохраняет соединение открытым, поэтому я предполагаю, что соединение закрывается через некоторое время (цикл while выполняется всего несколько секунд)
Что вызывает разрыв соединения?
Обновление
Смена контейнера B с uWSGI на gunicorn устраняет проблему.