У меня есть файл 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
- это может быть именно то, что нужно для поиска решения!