node.js - telemetry - requesterror error getaddrinfo enotfound
Docker DNS getaddrinfo ENOTFOUND (1)
Para una mejor búsqueda de DNS, podría considerar usar una superposición de red, como se presenta en " Redes superpuestas Docker: Eso fue fácil "
Utiliza una base de almacenamiento KV (clave / valor) en Consul , y un clúster de enjambre donde puede registrar sus nodos.
Puedes construir una red de superposición
eval "$(docker-machine env --swarm c0-master)"
docker network create -d overlay myStack1
Y úsalo para ejecutar una imagen:
docker run -d --name web --net myStack1 nginx
docker run -itd --name shell1 --net myStack1 alpine /bin/sh
Ambos contenedores se conectarán a la misma red y se podrán descubrir por nombre del contenedor (independientemente de la orden de inicio).
Además, cuando se reinicia un contenedor, seguirá siendo visible sin reinicios en cascada.
Estoy ejecutando dnsdock
node:4.2.1-wheezy
dnsdock
con node:4.2.1-wheezy
contenedores node:4.2.1-wheezy
y dnsdock
.
Tengo DOCKER_OPTS="--dns 172.17.42.1"
dentro de / etc / default / docker.
Cuando ejecuto el node -e "require(''dns'').resolve(''host_name_here'')"
dentro de mi contenedor node.js, el host se resuelve correctamente a través del servidor 172.17.42.1 dns.
Pero cuando ejecuto el node -e "require(''dns'').lookup(''host_name_here'')"
falla con el error ENOTFOUND
.
Y el problema es que http.request
utiliza dns.lookup
lugar de dns.resolve
.
Los documentos dicen que dns.lookup
llama a getaddrinfo
. Y por lo que entiendo, getaddrinfo
almacena en caché /etc/resolv.conf y tal vez almacena en caché el archivo /etc/resolv.conf (pero cat /etc/resolv.conf
imprime el nameserver 172.17.42.1
).
Realmente no tengo idea de cómo resolver este problema. ¿Qué puede causar tal comportamiento?
Actualización 1.
docker -v
Docker version 1.7.1, build 786b29d
docker-compose -v
docker-compose version: 1.4.2
Actualización 2.
Actualicé todo a las últimas versiones (docker 1.9.0, docker-compose 1.5.0 y nodo hasta 5.0.0) pero el problema persiste.
Entonces este es el docker-compose.yml que reproduce el problema:
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
Debe reemplazar 172.17.42.1
con IP de su interfaz docker0. El setTimeout(..., 5000)
es necesario porque el contenedor de node
puede iniciarse antes de dnsdock
.
Este es mi resultado de 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