Произвольная ошибка «Сброс соединения по одноранговой сети» с помощью docker-compose и uWSGI - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь запустить тесты моего приложения с помощью 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 устраняет проблему.

...