Ошибка соединения 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
базу данных.