По какой-то причине у меня возникают трудности с подключением к PostgreSQL. Я где-то читал, что при использовании PostgreSQL из Docker локальный адрес меняется на имя сервиса. В этом случае, глядя на мой yml-файл в определении PostgreSQL
db:
image: postgres:latest
container_name: postgres_container
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: voting
networks:
- app
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
- "5433:5433"
healthcheck:
test: [ "CMD", "pg_isready", "-U", "postgres" ]
interval: 10s
timeout: 5s
retries: 5
Итак, судя по этому определению, локальный адрес должен быть db, как указано в yml-файле
engine = create_tables_for_voting.create_tables("postgresql+psycopg2://postgres:postgres123@db:5433/voting")
Session = sessionmaker(bind=engine)
session = Session()
Это тоже не сработало, как указано в
Ошибка при подключении к db: (psycopg2.OperationalError) не удалось перевести имя хоста "db" в адрес: известного хоста не существует.
Я подумал, почему бы не попробовать использовать localhost, и при этом
Ошибка при подключении к db: (psycopg2.OperationalError) соединение с сервером по адресу "localhost" (::1), порт 5433 не удалось: сервер неожиданно закрыл соединение. Это, вероятно, означает, что сервер аварийно завершил работу.
Моя последняя идея, прочитав проблемы других. Один человек столкнулся с проблемой, что порт 5432 продолжал использоваться другим экземпляром. Вот почему есть дополнительные определения портов
Я уже потратил несколько часов на это, если кто-то может помочь мне с этим
Ответ
Чтобы решить вашу проблему с подключением к PostgreSQL через Docker, давайте рассмотрим несколько ключевых аспектов и потенциальных решений.
1. Конфигурация вашей docker-compose.yml
Ваш файл docker-compose.yml
выглядит в целом достаточно хорошо, но есть несколько моментов, на которые стоит обратить внимание:
-
Убедитесь, что контейнер PostgreSQL действительно работает. Вы можете проверить это с помощью команды:
docker ps
Убедитесь, что контейнер с именем
postgres_container
запущен. -
Проверьте, правильно ли настраиваются порты. Вы указали и 5432, и 5433, но на самом деле, если вы хотите подключиться к базе данных, вы должны использовать тот порт, который сопоставляется с внутренним портом вашего контейнера. В данном случае 5432:
ports: - "5432:5432"
2. Использование имени сервиса для подключения
Как вы правильно заметили, если ваш сервис называется db
, вы должны использовать это имя при подключении. Убедитесь, что вы указываете правильный порт в строке подключения.
Ваш код должен выглядеть так:
engine = create_tables_for_voting.create_tables("postgresql+psycopg2://postgres:postgres@db:5432/voting")
3. Проверка сети
Убедитесь, что у вас правильно настроена сеть. Вы используете сеть app
, но убедитесь, что все ваши контейнеры подключены к этой сети. Если нет, добавьте в ваш файл docker-compose.yml
:
networks:
app:
driver: bridge
4. Проверка состояния контейнера PostgreSQL
Если вы видите сообщение об ошибке, говорящей о том, что сервер закрыл соединение или терминал был непривычным образом завершен, возможно, что PostgreSQL не стартовал правильно. Вы можете проверить журналы контейнера, чтобы выяснить причину, выполнив:
docker logs postgres_container
Это должно помочь вам понять, произошло ли что-то неправильное при запуске PostgreSQL, например, ошибка конфигурации или проблемы с доступом к существующим данным.
5. Убедитесь, что порты не заняты
Как вы уже упоминали, стоит убедиться, что другой процесс не занимает 5432 или 5433. Для этого вы можете использовать команды, такие как:
lsof -i :5432
lsof -i :5433
6. Запуск Docker Compose
После того, как вы сделали все необходимые проверки и исправления, попробуйте вновь запустить docker-compose
:
docker-compose down
docker-compose up -d
7. Подключение к базе данных через psql
Вы также можете попытаться подключиться к PostgreSQL напрямую из командной строки, используя psql
, чтобы убедиться, что соединение работает:
docker exec -it postgres_container psql -U postgres -d voting
Если вы можете подключиться к базе данных на этом этапе, значит основной код, который использует SQLAlchemy, тоже должен работать, если он правильно настроен.
Заключение
Если после выполнения всех этих шагов у вас все еще возникают проблемы, пожалуйста, проверьте конфигурацию вашей сети и убедитесь, что ваш docker-compose
файл корректен и актуален. Если вы получите какие-либо новые ошибки, предоставьте их, для дальнейшей диагностики.