Как подключить локально размещенное приложение Django к докеризованной базе данных Postgres
Я изучаю Docker и через некоторое время мне удалось запустить базу данных postgres и приложение django в двух разных контейнерах. Проблема в том, что с Docker я не могу использовать инструменты отладки Pycharm.
Так что я хотел бы запускать свой код без docker, но держать базу данных в его контейнере.
Но я не могу соединить Dockerized postgres dabatase и локально размещенное Django App. У меня всегда возникает эта ошибка :
Я знаю, что профессиональная версия Pycharm позволяет подключить отладочный инструмент к контейнеру docker, но у меня его нет
Я видел этот вопрос , который делает все наоборот, но я ничего не нашел для своей проблемы.
Вот как создается мой контейнер базы данных в docker-compose.yml (данные аутентификации используются только для локальной разработки):
version: "3.7"
services:
db:
container_name: customer_platform_database_local
image: postgres
volumes:
- postgresPFC:/var/lib/postgresql/data
environment:
- POSTGRES_DB=pfcdb
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
hostname: db
expose:
- "5433" # Publishes 5433 to other containers but NOT to host machine
ports:
- "5433:5433"
command: -p 5433
restart: always
...
volumes:
postgresPFC:
А вот и настройки моей базы данных в settings.py :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'pfcdb',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'localhost',
'PORT': 5433,
}
}
Я пытался заменить параметр HOST на 127.0.0.1, 172.23.0.1 (это ip контейнера db, выданный с помощью docker inspect), но ни один из них не сработал (если я использую 172.23.0.1, у меня происходит таймаут)
У меня такая же проблема с подключением локального pgadmin 4 к контейнеризированной базе данных, но я ожидаю, что она будет решена тем же способом.
Вы можете упростить отображение порта на docker-compose.yml
, перераспределив 5432 на 5433 для хоста.
При такой конфигурации я могу подключиться к базе данных pfcd
с помощью dbeaver
version: "3.7"
services:
db:
container_name: customer_platform_database_local
image: postgres
volumes:
- postgresPFC:/var/lib/postgresql/data
environment:
- POSTGRES_DB=pfcdb
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
hostname: db
ports:
- 5433:5432
restart: always
volumes:
postgresPFC:
Для ошибки соединения я подозреваю, что ошибка в имени драйвера
не django.db.backends.postgresql
но django.db.backends.postgresql_psycopg2
обратите внимание на финальную psycopg2
См. эту статью и официальные документы по хосту django
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'pfcdb',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'localhost',
'PORT': 5433,
}
}
Вы также должны проверить, не запущена ли на вашем хосте другая служба или экземпляр Postgres на том же порту 5433.