Не удается настроить PostgreSQL с Docker: ошибка операции. Сервер завершил работу ненормально?

Вопросы и ответы

По какой-то причине у меня возникают трудности с подключением к 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 файл корректен и актуален. Если вы получите какие-либо новые ошибки, предоставьте их, для дальнейшей диагностики.

Оцените материал
Добавить комментарий

Капча загружается...