Не удается подключиться к контейнеру Postgres с помощью psycopg2? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть файл docker -compose, который выглядит следующим образом:

version: "3.7"

services:
  app:
    stdin_open: true  
    tty: true 
    build:
      context: .
      dockerfile: app.Dockerfile
    volumes:
      - ${HOST_SAVE_DIRC}:${CONTAINER_SAVE_DIRC}
    depends_on:
      - postgres

  postgres:
    image: 'postgres'
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_HOST_AUTH_METHOD=trust
    restart: always
    expose:
      - "5432"

, где такие переменные, как POSTGRES_USER, являются записями из файла env. app.Dockerfile выглядит как

FROM python:3.8.3-slim-buster
COPY src /src/
COPY init.sql .
COPY .env .
COPY run.sh run.sh
COPY requirements.txt .
RUN ls -a
RUN pip install --no-cache-dir -r requirements.txt

Контейнеры создаются, затем пользователь входит в app контейнер с основной функцией вызываемой программы - это когда база данных вызывает

Из контейнера app я пытаюсь подключиться к контейнеру postgres через psycopg2. Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:

psycopg2.OperationalError: could not connect to server: No route to host
    Is the server running on host "postgres" (172.22.0.2) and accepting
    TCP/IP connections on port 5432?

с использованием вызова psycopg2, который выглядит как

with psy.connect(host='postgres', port=5432, user='postgres', password='postgres') as conn:
    ...

записи этого вызова psycopg2 соответствуют env файл передается в файл docker-compose.

Насколько я понимаю, Postgres использует порт 5432 по умолчанию. Кроме того, когда docker-compose создает два контейнера - он создает сеть docker для этих контейнеров, имя DIR_default, где DIR - это имя каталога, в котором находится файл docker -compose, где каждый контейнер может быть доступ осуществляется с использованием имени, указанного в файле docker -compose (в этих случаях 'postgres' и 'app').

Среди различных попыток:

  • Я проверил, и база данных не падает между созданным контейнером и пользователем exe c 'd in.

  • Я пробовал различные небольшие изменения, например изменение имен контейнеров, postgres данные для входа и т. д. c.

  • Я пробовал явно связать имя контейнера postgres с link: "postgres:postgres".

  • Предлагаемые другие решения здесь

Любая помощь будет принята с благодарностью! Я не вижу причин, по которым что-то такое простое должно происходить, но я тоже здесь.


Изменить:

Проверка связи с контейнером Postgres из контейнер app кажется работающим при запуске docker exec app ping postgres_container_name. Является ли это признаком того, что сеть Docker настроена правильно и проблема в моей?


Редактировать 2:

Пробовал очистить все изображения и контейнеры, затем перезапустив демон Docker, а затем мой P C. Без изменений в любом случае.

Для справки, команда ping выглядела как

docker exec python-app ping name_given_to_postgres_container

, возвращая различные утверждения, которые выглядели как

64 bytes from name_given_to_postgres_container.project_name_default (172.18.0.3): icmp_seq=1 ttl=64 time=0.090 ms

, которые, если я не ошибаюсь, Я считаю, что это сигнал об успешном пинге.


Файл .env верхнего уровня, предоставленный для docker -compose

HOST_SAVE_DIRC=~/python_projects/project_directory/directory_in_project
CONTAINER_SAVE_DIRC=/pdfs

POSTGRES_DB=project_name  # same as project_directory
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_PORT=5432

Вот файл requirements.txt для приложение Python также

certifi==2020.4.5.1
chardet==3.0.4
idna==2.9
psycopg2-binary==2.8.5
read-env==1.1.0
requests==2.23.0
urllib3==1.25.9

Exe c -включение в контейнер Postgres с docker exec -it container_id bash и запуск psql -U postgres кажется успешным - даже с restart: always удалено. Я также вижу, что база данных, указанная в файле docker -compose, также создана. Я с уверенностью могу сказать, что этот контейнер не умирает спонтанно.

Однако попадание в порт 5432 на контейнере Postgres с помощью netcat через nc name_given_to_postgres_container 5432-5433 возвращает ошибку, аналогичную той, которую возвращает psycopg2

arxivist_postgres_1 [172.22.0.3] 5433 (?) : No route to host
arxivist_postgres_1 [172.22.0.3] 5432 (postgresql) : No route to host

Та же ошибка возвращается с curl. Итак, я предполагаю, что проблема не в контейнере Postgres напрямую, psycopg2 или имени хоста - а в чем-то с портом?


Редактировать 3:

В качестве последней попытки исправить этот проект, полный проект, на который ссылается это сообщение, размещен по этой ссылке . Если кто-то захочет загрузить репо и попытаться собрать сами контейнеры docker через ./start.sh - это может быть именно то, что нужно для поиска решения!

1 Ответ

0 голосов
/ 27 июня 2020

Я думал, что на моем компьютере установлен Docker, на котором работает Fedora 32. Однако, как я понял из этой статьи , настройка Docker на Fedora 32 требует некоторых дополнительных действий. ранее не знал.

Специально для этой проблемы, указанная в статье команда для добавления Docker в белый список Docker брандмауэра локальной сети с помощью команды

sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade

Итак Я считаю, что причиной root моей проблемы была просто возможность моего контейнера app, заблокированного брандмауэром для доступа к контейнеру postgres. После внесения вышеуказанных изменений программа наконец заработала!

...