Ошибка подключения базы данных Django к образу docker postgres
settings.py
файл:
from decouple import config
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': config('POSTGRES_DB'),
'USER': config('POSTGRES_USER'),
'PASSWORD': config('POSTGRES_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': config('POSTGRES_PORT'),
}
}
.env
файл:
# DJANGO
SECRET_KEY='foobar'
DEBUG=False
ALLOWED_HOSTS=localhost 127.0.0.1
# DATABASE
POSTGRES_DB=cheflist
POSTGRES_USER=postgres
POSTGRES_PASSWORD=123123
POSTGRES_HOST=localhost
POSTGRES_PORT=5433
DB_HOST=0.0.0.0
docker-compose.yml
файл:
version: "3.8"
services:
db:
container_name: db
image: postgres:13-alpine
restart: always
env_file:
- ./.env
volumes:
- ./postgres_data/db:/var/lib/postgresql/data/
ports:
- 5433:5433
Первый вопрос в том, что когда я поднимаю postgres
изображение, все идет хорошо, НО в логах появляется сообщение:
db | 2022-09-20 10:23:05.118 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db | 2022-09-20 10:23:05.119 UTC [1] LOG: listening on IPv6 address "::", port 5432
db | 2022-09-20 10:23:05.123 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db | 2022-09-20 10:23:05.142 UTC [21] LOG: database system was shut down at 2022-09-20 10:19:44 UTC
db | 2022-09-20 10:23:05.163 UTC [1] LOG: database system is ready to accept connections
По какой-то причине порт, к которому подключен postgres в docker, равен 5432
, хотя я указал 5433
.
Второй вопрос. Когда я запускаю python manage.py runserver
терминал выкидывает ошибку:
django.db.utils.OperationalError: connection to server at "0.0.0.0", port 5433 failed: Cannot assign requested address (0x00002741/10049)
Is the server running on that host and accepting TCP/IP connections?
... и мне кажется, что это как-то связано с моим первым вопросом, поскольку изначально изображение не подключено к нужному порту
postgresql
по умолчанию запускается на порту 5432
. Таким образом, в контейнере postgres
сервис запущен на 5432
.
Если вы хотите подключиться к его контейнеру с другим портом, вы должны указать его на 5432
. Таким образом:
ports:
- 5433:5432
Теперь вы можете соединиться с портом 5433
в хосте.
Но для подключения через контейнеры, вы должны подключиться к 5432
. Поэтому исправьте порт на 5432
в настройках и ваш второй вопрос будет решен.
Но если вы хотите изменить порт postgres
в его контейнере, вы можете использовать command: -p 5433
:
services:
db:
container_name: db
image: postgres:13-alpine
restart: always
env_file:
- ./.env
volumes:
- ./postgres_data/db:/var/lib/postgresql/data/
expose:
- "5433"
ports:
- 5433:5433
command: -p 5433
См. SO Answer для более подробной информации.