#django #linux #postgresql #docker #docker-compose
Вопрос:
Я удивлен, что не могу заставить это работать, так как я несколько раз запускал приложения django с базой данных postgres в контейнерах docker, однако на этот раз на моей машине Linux приложение django не может подключиться к контейнеру postgres docker, тогда как на моем Mac установка работает без проблем.
Я получаю стандартную ошибку:
django.db.utils.Ошибка операции: не удалось подключиться к серверу: Хост недоступен Сервер работает на хосте «postgresdb» (172.27.0.2) и принимает соединения TCP/IP на порту 5432?
Контейнер postgres запущен и должен быть доступен. Я проверяю IP-адрес контейнера docker, и он кажется правильным. Мой файл docker-compose выглядит следующим образом:
version: "3.8"
services:
app:
container_name: data-management
restart: always
build: ./
ports:
- '3000:3000'
links:
- 'postgresdb'
volumes:
- ./:/usr/local/share/src/app
env_file:
- .dev.env
postgresdb:
container_name: be-postgres
restart: always
image: postgres:13.4-alpine
ports:
- '5432:5432'
volumes:
- postgres-db:/var/lib/postgresql/data
env_file:
- .dev.env
volumes:
postgres-db:
Конфигурации хранятся в файле среды, который используется в обоих контейнерах, чтобы избежать любых несоответствий.
POSTGRES_PASSWORD=devpassword123
POSTGRES_USER=devuser
POSTGRES_SERVICE=postgresdb
POSTGRES_PORT=5432
POSTGRES_DB=data_management
Настройки базы данных django настолько стандартны, насколько это возможно:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': os.environ['POSTGRES_SERVICE'],
'NAME': os.environ['POSTGRES_DB'],
'PORT': os.environ['POSTGRES_PORT'],
'USER': os.environ['POSTGRES_USER'],
'PASSWORD': os.environ['POSTGRES_PASSWORD'],
}
}
У меня нет идей о том, что может быть причиной этого, так как это происходит только на моей машине Fedora, и при работе на моем Mac проблем нет. В прошлом у меня уже были проблемы с SELinux с некоторыми томами docker, однако после поиска в Google я не смог найти никаких предположений о том, что SELinux снова может быть виновником.
Комментарии:
1. Что-нибудь в журналах контейнеров Postgres указывает на то, что он работает неправильно?
2. Брандмауэр блокирует порт? Ты можешь это сделать
psql -d <db_name> -p 5432 -h 172.27.0.2 -U <some_user>
? Чтоlisten_addresses
установлено вpostgresql.conf
? Добавьте ответы в качестве обновления к вопросу.3. К сожалению, в журналах postgres нет никаких проблем. @AdrianKlaver при выполнении команды в контейнере postgres я могу успешно подключиться к базе данных
4. Это в значительной степени само собой разумеется. Что вам нужно сделать, так это попытаться подключиться извне контейнера, так как именно в этом и заключается проблема. Когда вы добавите полную команду, которую вы используете, и результат к вашему вопросу. Также, пожалуйста, ответьте на другие вопросы, которые я задавал в качестве обновлений к вашему вопросу.
5. Спасибо всем за добавление комментариев! Проблема действительно заключалась в брандмауэре, как упоминал @AdrianKlaver. Fedora изменилась с
iptables
наnftables
, и это нарушило внутреннюю связь с контейнером. Изменив его, чтобыiptables
решить проблему, однако, я не уверен, что это решение является лучшим.