Как с SQLAlchemy подключиться к базе Postgres, запущенной в контейнере Docker

Рейтинг: 1Ответов: 1Опубликовано: 22.03.2023

Мне нужно создать таблицу в Postgres, для этого я хочу использовать SQLAlchemy. В одном контейнере у меня запущен проект с SQLAlchemy, а во втором Postgres запущена Postgres. для этого я создал такой docker-compose файл:

services:
  postgres:
    image: postgres:13.0-alpine
    container_name: test_postgres
    ports:
      - "5432:5432"
    volumes:
      - db_value:/var/lib/postgresql/data/
    env_file:
      - google_api_orders/.env
  app:
    build: /google_api_orders
    restart: always
    links:
      - postgres
    depends_on:
      - postgres
    env_file:
      - google_api_orders/.env
volumes:
  db_value:

введите сюда описание изображения

Но при попытке подключиться и создать новую таблицу:

engine = create_engine('postgresql+psycopg2://admin:admin@127.0.0.1:5432/orders_db')
engine.connect()

я получаю ошибку:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "127.0.0.1", port 5432 failed: Connection refused

Как правильно подключиться к базе, запущенной в контейнере Docker из другого контейнера?

Ответы

▲ 0

Почему не работает 127.0.0.1. docker compose создаёт отдельную виртуальную сеть и подключает к ней контейнеры. В этой сети у контейнеров адреса вида 172.17.0.2 и 172.17.0.3, но какой будет префикс для IP адресов, заранее предсказать нельзя (на самом деле можно, но не нужно). Поэтому ваша база данных располагается не на 127.0.0.1, а на 172.17.0.2

docker compose поднимает DNS сервер, который раздаёт имена контейнерам. Добавьте к сервису postgres ключ hostname: db, тогда в строке подключения вы можете указать имя вместо IP адреса:

engine = create_engine('postgresql+psycopg2://admin:admin@db:5432/orders_db')

Имя хоста db обслужит встроенный DNS сервер докера.