@kurrbanov
Пишу бэкенд на Питоне

Почему Docker контейнер не видит PostgreSQL?

Один контейнер должен с помощью aiopg создавать таблицу и добавлять туда данные. Контейнер с docker-compose и прогой, которая добавляет данные описаны так:
P.S. файл сокращен, чтобы не был слишком громоздким. Показана часть, которая выдаёт ошибки.

version: "3.9"

services:
  db:
    image: postgres:13
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=drama
      - POSTGRES_USER=drama_user
      - POSTGRES_PASSWORD=pass
    ports:
      - "5432:5432"
  dramatiq:
    build:
      context: ./
      dockerfile: ./dramatiq/Dockerfile
    depends_on:
      - redis
      - db


Dockerfile у контейнера dramatiq ничем не примечателен. Просто копирование всех файлов в директории, установление зависимостей и запуск кода.

Вот подключение через aiopg:
connection = await aiopg.connect(database="drama", user="drama_user", password="pass", host="db")
cursor = await connection.cursor()


После того, как я поднимаю докер контейнеры, в логах вижу следующую ошибку:

dramatiq_1  |   File "/usr/local/lib/python3.9/site-packages/aiopg/connection.py", line 788, in _ready
dramatiq_1  |     state = self._conn.poll()
dramatiq_1  | psycopg2.OperationalError: could not connect to server: Connection refused
dramatiq_1  |   Is the server running on host "db" (172.29.0.3) and accepting
dramatiq_1  |   TCP/IP connections on port 5432?


С чем может быть связана такая ошибка?
  • Вопрос задан
  • 1421 просмотр
Решения вопроса 1
@deliro
С чем может быть связана такая ошибка?

С тем, что твой скрипт запускается быстрее базы. depends докера работает крайне примитивно и правильно: если контейнер запущен, значит зависимость резолвится. Но в запущеном контейнере далеко не факт, что база данных запустилась. Между этими двумя событиями может пройти много времени — несколько секунд.

Для начала сделай в скрипте sleep(10). Если это поможет, то вот решение
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kirillinyakin
Чтобы обращаться через db нужно объединить контейнеры в одну сеть
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы