我正在運行碼頭 - 與node:4.2.1-wheezy
和dnsdock
容器組成。Docker DNS getaddrinfo ENOTFOUND
我在/ etc/default/docker裏有DOCKER_OPTS="--dns 172.17.42.1"
。
當我在我的node.js容器中運行node -e "require('dns').resolve('host_name_here')"
時,主機通過172.17.42.1 dns服務器正確解析。
但是,當我運行node -e "require('dns').lookup('host_name_here')"
它失敗,並出現ENOTFOUND
錯誤。
問題是http.request
使用dns.lookup
而不是dns.resolve
。
The docs say that dns.lookup
calls getaddrinfo
。據我所知,getaddrinfo
緩存/etc/resolv.conf可能會緩存空的/etc/resolv.conf(但cat /etc/resolv.conf
打印nameserver 172.17.42.1
)。
我真的不知道如何解決這個問題。什麼會導致這種行爲?
更新1
docker -v
Docker version 1.7.1, build 786b29d
docker-compose -v
docker-compose version: 1.4.2
更新2
我所有的東西更新到最新版本(1.9.0碼頭工人,碼頭工人,組成1.5.0和節點高達5.0 .0)但問題仍然存在。
所以這是搬運工,compose.yml再現問題:
dnsdock:
image: tonistiigi/dnsdock
volumes:
- /var/run/docker.sock:/run/docker.sock
ports:
- "172.17.42.1:53:53/udp"
environment:
- DNSDOCK_ALIAS=dns.org
node:
image: node:5.0.0-wheezy
command: node -e "setTimeout(function() { var dns = require('dns'); dns.resolve('dns.org', console.log.bind(console, 'resolve')); dns.lookup('dns.org', console.log.bind(console, 'lookup')); }, 5000)"
dns: 172.17.42.1
您應該與docker0接口的IP取代172.17.42.1
。需要setTimeout(..., 5000)
,因爲node
集裝箱可能在dnsdock
之前啓動。
這是我docker-compose up
輸出:
Creating test_node_1
Creating test_dnsdock_1
Attaching to test_node_1, test_dnsdock_1
dnsdock_1 | 2015/11/07 09:29:44 Added service: 3653951cff40c06c04b9ab3f5d2fc94ccc19305eaac7ba1a545ce1dbab3e3e17 {test_dnsdock_1 dnsdock 172.17.42.3 -1 [dns.org]}
dnsdock_1 | 2015/11/07 09:29:44 Added service: 36577feea136bc713f77b64b2a6a9712cd509c47ca55427f6749308cc5a4b140 {test_node_1 node 172.17.42.2 -1 []}
node_1 | resolve null [ '172.17.42.3' ]
node_1 | lookup { [Error: getaddrinfo ENOTFOUND dns.org]
node_1 | code: 'ENOTFOUND',
node_1 | errno: 'ENOTFOUND',
node_1 | syscall: 'getaddrinfo',
node_1 | hostname: 'dns.org' }
dnsdock_1 | 2015/11/07 09:29:49 Stopped service: 36577feea136bc713f77b64b2a6a9712cd509c47ca55427f6749308cc5a4b140
test_node_1 exited with code 0
你可以分享一個碼頭 - 撰寫。yml重現你的設置? –
也請考慮包含一個可以重現這一點的示例腳本。 –