Ошибка соединения docker-compose django и postgres

Я пытаюсь сделать микросервис django с базой данных postgres. и у меня есть проблема, которую я не могу решить уже несколько дней. этот вопрос содержит множество ошибок. поэтому вы можете проигнорировать их и ответить на главный вопрос, как иметь docker-compose с django и postgres контейнерами.

docker-compose.yml выглядит следующим образом:

version: "3.9"
services:
  # Redis
  redis:
    image: redis:7.0.4-alpine
    container_name: redis
  # rabbit
  rabbit:
    hostname: rabbit
    image: "rabbitmq:3.10.7-alpine"
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=mypass
    ports:
      - "15672:15672"
      - "5672:5672"
  mongodb_container:
    image: mongo:5.0.10
    ports:
      - "27017:27017"
    depends_on:
      - redis
  # Main Database Postgres
  # it should be same as ${DB_HOST}
  main_postgres_ser:
    image: postgres:14.4-alpine
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB= postgres # NAME
      - POSTGRES_USER= postgres # USER
      - POSTGRES_PASSWORD= postgrespass # PASSWORD
    container_name: postgres_container
    restart: always
    ports:
      # - 8000:8000 # HTTP port
      - 5432:5432 # DB port
    networks:
      - djangonetwork
    depends_on:
      - rabbit
  # Main Django Application
  main_django_ser:
    build:
      context: . #/main_ms
      dockerfile: Dockerfile_main_ms
    container_name: main_django
    command: "python manage.py runserver 0.0.0.0:8000"

    environment:
      PYTHONUNBUFFERED: 1
    ports:
      - 8000:8000
    volumes:
      - .:/main_ms
    networks:
      - djangonetwork
    depends_on:
      - main_postgres_ser
      - rabbit
    links:
      - main_postgres_ser:main_postgres_ser
networks:
  djangonetwork:
    driver: bridge
volumes:
  main_postgres_ser:
    driver: local

Dockerfile для сервиса django выглядит следующим образом:

FROM python:3.10.6-buster
ENV PYTHONUNBUFFERED=1

RUN apt-get update -y
RUN apt-get update && \
      apt-get -y install sudo
WORKDIR /main_ms
COPY requirements.txt ./main_ms/requirements.txt
RUN pip3 install -r ./main_ms/requirements.txt

и в settings.py в DATABASES у меня есть

DATABASES = {
    'default': {
        # 'default':'psql://postgres:postgrespass@postgres:5432/postgres',
        # 'default':'postgres://postgres:postgrespass@postgres:5432/postgres',
        # 'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'ENGINE': 'django.db.backends.postgresql',
        'NAME' : 'postgres',
        'USER' : 'postgres',
        'PASSWORD' : 'postgrespass',
        # HOST should be as postgres service name
        'HOST' : 'main_postgres_ser',
        'PORT' : '5432',
         }}

Как я знаю, HOST должен быть таким же, как имя службы postgres (здесь main_postgres_ser), потому что DNS name будет таким же.

аутентификация по паролю не прошла для пользователя Error

Итак, я собрал docker-compose, затем запустил проект django, запустил docker-compose и внутри контейнера django сделал миграции, но когда я делаю python manage.py migrate я получаю django.db.utils.OperationalError: FATAL: password authentication failed for user "postgres"

так с просто сохраняя умолчания в DATABASES в settings.py('default':'postgres://postgres:postgrespass@main_postgres_ser:5432/postgres',) с шаблоном 'default':'postgres://postgres:pass@host:port/dbname',. Таким образом, я получил все закомментированное в DATABASES (кроме default и ENGINE) и избавился от последней ошибки. Обратите внимание, что мне пришлось сохранить 'ENGINE': 'django.db.backends.postgresql', (чтобы не получить другую ошибку) в DATABASES.

Пожалуйста, введите ИМЯ или OPTIONS['service'] Ошибка

но потом я снова получил django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the NAME or OPTIONS['service'] value. заметку Я также могу получить доступ http://localhost:8000/ на browser и там у меня была желтая страница отладки django.

соединения на сокете домена Unix PGSQL.5432 Error

но когда я раскомментировал 'NAME' : 'postgres', в DATABASES я получил connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? ошибку У меня нет доступа к http://localhost:8000/ в browser снова.

не введен пароль Ошибка

поэтому я откомментировал HOST в DATABASES и получил django.db.utils.OperationalError: fe_sendauth: no password supplied

снова password authentication failed for user ошибка

поэтому я откомментировал PASSWORD и получил django.db.utils.OperationalError: FATAL: password authentication failed for user "root", что совпадает с django.db.utils.OperationalError: FATAL: password authentication failed for user "postgres" (в случае откомментирования 'USER'='postgres'), так что я снова на первом шаге!!!

внутри контейнера django я пытался CREATE USER с помощью CREATE USER postgres WITH PASSWORD 'postgrespass'; или postgres=# CREATE USER postgres WITH PASSWORD 'postgrespass';, но получил CREATE: not found Я снова попробовал в postgres container и получил тот же результат.

Я также попробовал последнее решение, добавив local all postgres peer к pg_hba.conf все равно не сработало.

sudo -u root postgresql psql привел sudo: postgresql: command not found или sudo service postgresql start привел postgresql: unrecognized service

затем я попытался получить доступ к оболочке psql с помощью docker exec -it -u postgres postgres_container psql, на что получил psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "postgres" does not exist

так как я могу сделать docker-compose для django и postgres???

Спасибо @hedayat Я понял, что пробелы после = в docker-compose не являются причиной, а основной причиной было то, что между шагами создания папок django (проект и приложения) создается data\db и это не позволяет аутентификации произойти. поэтому, удалив data\db я смог сделать migrate базу данных.

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