Как с SQLAlchemy подключиться к базе Postgres, запущенной в контейнере Docker
Мне нужно создать таблицу в 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:[email protected]:5432/orders_db')
engine.connect()
я получаю ошибку:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "127.0.0.1", port 5432 failed: Connection refused
Как правильно подключиться к базе, запущенной в контейнере Docker из другого контейнера?
Ответы (1 шт):
Почему не работает 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 сервер докера.
