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로 해석하므로 작업 할 수 있습니까?
PGHOST와 PGHOSTADDR을 모두 갖고있는 것이 불필요하게 혼란스럽고 중복되는 것으로 나타났습니다. 두 사람 모두 호스트 이름이나 IP 주소를 허용하도록 패치를 제출해야합니다. – AnotherSmellyGeek