Ошибка подключения базы данных 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 для более подробной информации.

Вернуться на верх