다음과 같은 도커 작성 파일이 있습니다.
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
두 개의 컨테이너를 생성 할 때 해당 컨테이너 이름에 대한 도커 네트워크를 생성합니다. DIR_default
여기서는 DIR
docker-compose 파일이있는 디렉터리의 이름입니다. 여기서 각 컨테이너는 docker-compose 파일에 나열된 이름을 사용하여 액세스 할 수 있습니다. 이 경우 'postgres'및 'app').
다양한 시도 중 :
확인한 결과 컨테이너가 생성되고 사용자가 실행되는 사이에 데이터베이스가 작동하지 않습니다.
컨테이너 이름, postgres 로그인 정보 등을 변경하는 것과 같은 다양한 작은 변경을 시도했습니다.
postgres 컨테이너 이름을 명시 적으로 link: "postgres:postgres"
.
여기에 제안 된 다른 솔루션
어떤 도움이라도 대단히 감사하겠습니다! 이처럼 단순한 일이 발생해야 할 이유가 없지만 여기에 있습니다.
편집하다:
Postgres
컨테이너에서 컨테이너를 Ping하는 app
것은 실행할 때 작동하는 것처럼 보입니다 docker exec app ping postgres_container_name
. 이것은 Docker 네트워크가 올바르게 설정되었고 문제가 내 문제라는 신호입니까?
편집 2 :
모든 이미지와 컨테이너를 지우고 Docker 데몬을 다시 시작한 다음 PC를 다시 시작했습니다. 두 경우 모두 변경되지 않습니다.
참고로 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
내가 착각하지 않는 한 성공적인 핑 신호라고 생각합니다.
docker-compose에 제공된 최상위 .env 파일
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
를 사용하여 Postgres 컨테이너로 docker exec -it container_id bash
실행 psql -U postgres
하는 것은 restart: always
제거 된 경우에도 성공한 것으로 보입니다 . docker-compose 파일에 이름이 지정된 데이터베이스도 생성 된 것을 볼 수 있습니다. 이 용기는 저절로 죽지 않는다고 확신합니다.
그러나 netcat via를 사용하여 Postgres 컨테이너의 5432 포트에 연결하면 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 :
이 프로젝트를 수정하기위한 마지막 시도로이 게시물이 참조하는 전체 프로젝트 가이 링크에 게시 됩니다 . 누구든지 repo를 다운로드하고이를 통해 도커 컨테이너를 직접 빌드하려는 ./start.sh
경우 솔루션을 찾는 데 필요한 것일 수 있습니다!
Fedora 32를 실행하는 내 컴퓨터에 Docker 설정이 있다고 생각했습니다. 그러나이 기사 를 통해 알게 된 것처럼 Fedora 32에서 Docker를 설정하려면 이전에 알지 못했던 몇 가지 추가 단계가 필요합니다.
특히이 문제의 경우 문서에 나열된 명령을 사용하여 로컬 네트워크의 방화벽에서 Docker를 허용 목록에 Docker에 추가합니다.
sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade
그래서 내 문제의 근본 원인은 단순히 내 app
컨테이너가 postgres
방화벽에 의해 컨테이너에 액세스하지 못하도록 차단 된 것이라고 생각합니다 . 위의 변경으로 프로그램이 마침내 작동했습니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다