unable telemetry requesterror nodejs error enotfound eai_again node.js dns docker

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