2017-12-29 37 views
1

Docker Compose를 사용하여 PostgreSQL (실제로 PostGIS)이 포함 된 컨테이너와 PostgreSQL을 쿼리하는 웹 응용 프로그램이 포함 된 컨테이너를 만들려고합니다.PostgreSQL 클라이언트가 Docker 컨테이너에서 호스트 이름을 확인할 수 없습니다.

내 고정 표시기 - compose.yaml은 다음과 같습니다

version: '3.1' 

services: 
    db: 
    build: 
     context: . 
     dockerfile: Dockerfile-db 
    restart: always 
    ports: 
     - 5432:5432 
    web: 
    build: 
     context: . 
     dockerfile: Dockerfile-web 
     args: 
     PGHOSTADDR: db 
    restart: always 
    ports: 
     - 80:80 
    depends_on: 
     - db 

Dockerfile이 응용 프로그램 :

FROM mdillon/postgis 

PostgreSQL의 컨테이너가 시작되고 나타납니다

FROM php:apache 
ARG PGHOSTADDR 
ENV PGHOSTADDR=$PGHOSTADDR 
COPY . /var/www/html/ 
RUN apt-get update && mkdir -p /usr/share/man/man1 /usr/share/man/man7 && apt-get install -y postgresql-client strace ltrace iputils-ping bind9-host dnsutils 
CMD until psql -c '\q' ; do sleep 1 ; done ; /usr/sbin/apache2 

PostgreSQL의 Dockerfile은 그냥 완벽하게 작동하려면 - 호스트에서 쿼리 할 수 ​​있으며 응용 프로그램 conta에서 쿼리 할 수 ​​있습니다. iner. PostgreSQL 컨테이너의 IP 주소를 사용하는 한.

그러나, 응용 프로그램 컨테이너에서 실행 'psql의'는 PostgreSQL의에 도달 할 수 없습니다 : 그것은 주어진 호스트 이름을 해결하기 위해 실패 할 때

$ docker-compose up -d && echo MARK && docker-compose logs --follow web 
WARNING: The Docker Engine you're using is running in swarm mode. 

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node. 

To deploy your application across the swarm, use `docker stack deploy`. 

Starting myapp_db_1 ... 
Starting myapp_db_1 ... done 
Starting myapp_web_1 ... 
Starting myapp_web_1 ... done 
MARK 
Attaching to myapp_web_1 
web_1 | psql: could not translate host name "db" to address: Name or service not known 
web_1 | psql: could not translate host name "db" to address: Name or service not known 
web_1 | psql: could not translate host name "db" to address: Name or service not known 
web_1 | psql: could not translate host name "db" to address: Name or service not known 

는 일반적으로 'psql의'는이 진단을 출력합니다. 그러나 호스트 이름 확인 앱 컨테이너에 벌금을 작동하는 것 같군 :

$ docker exec -it myapp_web_1 bash 
[email protected]:/var/www/html# dig db 

; <<>> DiG 9.10.3-P4-Debian <<>> db 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21082 
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 

;; QUESTION SECTION: 
;db.    IN A 

;; ANSWER SECTION: 
db.   600 IN A 172.22.0.2 

;; Query time: 0 msec 
;; SERVER: 127.0.0.11#53(127.0.0.11) 
;; WHEN: Fri Dec 29 04:18:32 UTC 2017 
;; MSG SIZE rcvd: 38 

[email protected]:/var/www/html# ping -c 2 db 
PING db (172.22.0.2) 56(84) bytes of data. 
64 bytes from myapp_db_1.myapp_default (172.22.0.2): icmp_seq=1 ttl=64 time=0.036 ms 
64 bytes from myapp_db_1.myapp_default (172.22.0.2): icmp_seq=2 ttl=64 time=0.045 ms 

--- db ping statistics --- 
2 packets transmitted, 2 received, 0% packet loss, time 1020ms 
rtt min/avg/max/mdev = 0.036/0.040/0.045/0.007 ms 
[email protected]:/var/www/html# 

을 또한, PostgreSQL의 클라이언트와 서버가이 호스트 이름과 관련된 문제에서 떨어져 완벽하게 작동하는 것으로 나타납니다

[email protected]:/var/www/html# unset PGHOSTADDR 
[email protected]:/var/www/html# psql -h 172.22.0.2 -U postgres -c 'SELECT 1;' 
?column? 
---------- 
     1 
(1 row) 

[email protected]:/var/www/html# 

왜 ISN ' 'psql'은 'dig'가 할 수있는 것처럼 'db'를 172.22.0.2로 해석하므로 작업 할 수 있습니까?

답변

1

점으로 구분 된 십진수 IP 주소가되어야하는 PGHOSTADDR을 설정했지만, the PostgreSQL documentation에서 명확하게 설명 된 것처럼 호스트 이름이 될 수있는 PGHOST를 설정해야합니다. 예상대로

반환하기 PGHOSTADDR 대신 PGHOST가 만드는 설정 'psql의'작업 :

[email protected]:/var/www/html# psql -U postgres -c 'SELECT 1;' 
psql: could not translate host name "db" to address: Name or service not known 
[email protected]:/var/www/html# unset PGHOSTADDR 
[email protected]:/var/www/html# PGHOST=db 
[email protected]:/var/www/html# export PGHOST 
[email protected]:/var/www/html# psql -U postgres -c 'SELECT 1;' 
?column? 
---------- 
     1 
(1 row) 

[email protected]:/var/www/html# 

RTFM 또 다른 오류가 발생했습니다.

+0

PGHOST와 PGHOSTADDR을 모두 갖고있는 것이 불필요하게 혼란스럽고 중복되는 것으로 나타났습니다. 두 사람 모두 호스트 이름이나 IP 주소를 허용하도록 패치를 제출해야합니다. – AnotherSmellyGeek