@keddad
Ученик

Asyncpg в Docker — почему может падать с ошибкой No Route To Host, если route точно есть?

Есть группа контейнеров, которая поднимается похожим файлом:
version: "3"
services:
  ff_corecomp:
    restart: always
    build: ./corecomp
    depends_on:
      - ff_postgres
  ff_postgres:
    restart: always
    image: "postgres"
    environment:
      - POSTGRES_PASSWORD=pass


В ff_corecomp есть такой процесс создания пула для asyncpg:
await asyncpg.create_pool(
        dsn="postgres://postgres:pass@ff_postgres:5432/")


Неожиданно код начал падать на этой строчке. Traceback:
spoiler
File "./utils/db.py", line 13, in init_pool
ff_corecomp_1 | db.pool = await asyncpg.create_pool(
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 398, in _async__init__
ff_corecomp_1 | await self._initialize()
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 426, in _initialize
ff_corecomp_1 | await first_ch.connect()
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 125, in connect
ff_corecomp_1 | self._con = await self._pool._get_new_connection()
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 468, in _get_new_connection
ff_corecomp_1 | con = await connection.connect(
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/connection.py", line 1668, in connect
ff_corecomp_1 | return await connect_utils._connect(
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/connect_utils.py", line 663, in _connect
ff_corecomp_1 | raise last_error
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/connect_utils.py", line 652, in _connect
ff_corecomp_1 | con = await _connect_addr(
ff_corecomp_1 | File "/usr/local/lib/python3.8/site-packages/asyncpg/connect_utils.py", line 621, in _connect_addr
ff_corecomp_1 | tr, pr = await asyncio.wait_for(
ff_corecomp_1 | File "/usr/local/lib/python3.8/asyncio/tasks.py", line 483, in wait_for
ff_corecomp_1 | return fut.result()
ff_corecomp_1 | File "uvloop/loop.pyx", line 1974, in create_connection
ff_corecomp_1 | File "uvloop/loop.pyx", line 1951, in uvloop.loop.Loop.create_connection
ff_corecomp_1 | OSError: [Errno 113] No route to host


No route to host вызвала у меня ровно две идеи: сеть внутри докера маршрутизирует что то неверно, или контейнер с постргесом не поднялся.

Первая идея отпала быстро: я открыл шелл в контейнере ff_corecomp, и из него спокойно идут пинги до ff_postgres. Вторая идея тоже оказалась неверной: к моменту запуска контейнера ff_corecomp постгрес уже пишет, что готов принимать соединения. Что еще здесь может быть не так?
  • Вопрос задан
  • 240 просмотров
Решения вопроса 1
@keddad Автор вопроса
Ученик
Я не вполне понял, что решило проблему, но это один из двух вариантов из этого вопроса.

Либо это была проблема в TUN, и тогда помогло
sysctl net.bridge.bridge-nf-call-iptables=0
sysctl net.bridge.bridge-nf-call-arptables=0
sysctl net.bridge.bridge-nf-call-ip6tables=0


Либо проблема была в firewalld
# Allows container to container communication, the solution to the problem
firewall-cmd --zone=public --add-masquerade --permanent

# standard http & https stuff
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
# + any other port you may need

# reload the firewall
firewall-cmd --reload


В любом случае, я применил оба решения - все заработало.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Нужно описать доступ из одного контейнера в другой с помощью links в docker-compose.yml. Сейчас доступ режется докером.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы