【发布时间】:2020-05-26 08:57:45
【问题描述】:
我正在将 Nodejs 应用程序与 docker 一起部署在 AWS ecs 上。
问题是对私有 DNS 记录的 api 调用返回
error: getaddrinfo enotfound request
从研究来看,错误似乎与 DNS 查找有关(如果您有其他理论,请随时发表评论),所以我决定在 compose 上设置 DNS 服务器和 µextra_hostsµ。
即使一切都建立起来了,当我在 Dockerfile 中 cat /etc/hosts 时,它并没有改变。
问题是:
- 应该 /etc/hosts 由 extra_hosts 修改。
- 是否还有其他错误原因:
getaddrinfo enotfound request?所有其他 api 调用都工作,除了内部 DNS 工作一次和之后返回错误:getaddrinfo enotfound. - 使用 docker 配置 DNS 和主机的最佳方式是什么?
- 为什么它工作一次就停止了?
这就是我的 docker-compose 文件的外观:
version: '3'
services:
nodejs:
extra_hosts:
- "<name here>:<ip here>"
- "<name here>:<ip here>"
dns:
- <ip here>
- <ip here>
- <ip here>
network_mode: 'host'
build:
context: .
dockerfile: Dockerfile
这是 docker 文件的样子
FROM alpine:latest
RUN apk add --update nodejs nodejs-npm && apk add g++ make python
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
RUN cat /etc/hosts
EXPOSE 80
CMD npm start
这是 docker build 输出
Sending build context to Docker daemon 11.58MB
Step 1/11 : FROM alpine:latest
---> f70734b6a266
Step 2/11 : RUN apk add --update nodejs nodejs-npm && apk add g++ make python
---> Using cache
---> b173538c6ce5
Step 3/11 : WORKDIR /usr/src/app
---> Using cache
---> 0186bcca617d
Step 7/11 : RUN npm install
---> Using cache
---> 546f707d5fea
Step 8/11 : COPY . .
---> b66f4bec9d93
Step 9/11 : RUN cat /etc/hosts
---> Running in 1c48f0426713
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 1c48f0426713
Removing intermediate container 1c48f0426713
---> 858735acc4a6
Step 10/11 : EXPOSE 80
---> Running in dd7a8ae0669a
Removing intermediate container dd7a8ae0669a
---> 907a3dafb4fc
Step 11/11 : CMD npm start
---> Running in a3dd69c6ec3b
Removing intermediate container a3dd69c6ec3b
---> cda2214b2761
Successfully built cda2214b2761
Successfully tagged test:latest
【问题讨论】:
-
能否请您发布 Dockerfile 构建的输出
-
小问题,为什么
172.17.0.2 1c48f0426713IP 带有容器id?它应该是额外主机的限定名称 -
了解 docker-compose 和 Dockerfile 如何交互: 1. 构建镜像(通过 Dockerfile 或通过镜像) 2. 运行容器,添加来自 docker-compose 的所有信息。所以,是的,在构建时,您的
/etc/hosts没有尚未正确更改是有道理的。这还没有完全回答这个问题,但已经清楚了。 -
@β.εηοιτ.βε 你认为我应该在哪里寻找问题。 PS它只是部署错误,从本地mac一切正常。
-
尝试直接管理
/etc/hosts通常不是一个好主意,Docker 或其他方式:不同上下文中的主机文件可能会不同步,并且您可能会处于工作神秘的状态一个系统上的原因,而不是另一个系统上的原因。在 AWS 上,您可以使用 Route 53 设置内部 DNS;调试您的实际 DNS 问题可能比尝试解决它更好。
标签: node.js docker docker-compose axios