Docker npm安装错误:getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443

10

我正在使用RHEL 7上的Docker版本1.10.1,在使用下面的Dockerfile时出现npm安装错误。错误:getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443。在Ubuntu 14.04上使用docker 1.91相同的工作方式。当我获取bash并在容器上安装inetutils-ping时,我注意到我无法ping任何地方。

root@9deb4b274c1e:/home/nodexp#ping 8.8.8.8           
PING 8.8.8.8 (8.8.8.8): 56 data bytes
^C--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

为什么呢?当然我可以从RHEL进行ping测试

Dockerfile

FROM node:argon
# Create user nodexp in group nodexp
RUN groupadd -r nodexp \
    && useradd -m -r -g nodexp nodexp
WORKDIR /home/nodexp
# Install app dependencies
COPY package.json /home/nodexp
RUN npm install
# Bundle app source
COPY . /home/nodexp
EXPOSE 3000
CMD [ "npm", "start" ]

以及 package.json

{
  "name": "mp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "~4.13.1"

  }
}
7个回答

19

对于我来说,使用此命令重新启动 Docker 可以解决问题,但我不知道为什么。

sudo service docker restart


出现了这个问题,重新启动了服务器并解决了,你的答案可能也有效。 - PPP

17
我根据这篇文章解决了这个问题:https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns 实际上,在调用registry.npmjs.org时,您可以检查DNS是否失败。
为了检查这件事,我采取了以下步骤使其正常工作。
第一步
busybox镜像上运行此命令,我将使用google.com来模拟连接请求。
>> docker run busybox nslookup google.com 
   Unable to find image 'busybox:latest' locally
   latest: Pulling from library/busybox
   f70adabe43c0: Pull complete 
   Digest: sha256:58ac43b2cc92c687a32c8be6278e50a063579655fe3090125dcb2af0ff9e1a64
   Status: Downloaded newer image for busybox:latest
   nslookup: can't resolve 'google.com'
   Server:    8.8.8.8
   Address 1: 8.8.8.8

第二步

从第一步的结果可以看出,我遇到了错误并且无法连接到google.com,如果你也遇到了类似的错误,请按照以下步骤检查当前 DNS 路由。

 >> nmcli dev show | grep 'IP4.DNS' 
    IP4.DNS[1]:                             192.168.2.1

这个命令会显示你的IP4 DNS,本例中是192.168.2.1,在此步骤中你已经知道了DNS。

第三步

继续使用busybox容器并连接到此DNS,运行以下命令:

 >> docker run --dns 192.168.2.1 busybox nslookup google.com
    Server:    192.168.2.1
    Address 1: 192.168.2.1 giftcard.dyndns.org

    Name:      google.com
    Address 1: 2404:6800:4003:c03::65
    ....

第四步

如果您的结果与第三步类似,那么问题可能是Docker无法连接,因为Docker不知道将要使用的DNS,所以我们通过创建daemon.json文件并将其放置在/etc/docker/daemon.json中来解决这个问题。以下是需要添加的内容。

{
  "dns": ["192.168.2.1", "8.8.8.8"] // 192.168.2.1 is value of your dns
}

步骤五

重新启动您的 Docker 服务

>> sudo service docker restart

详细的解释,你节省了我的时间。谢谢 :) - Asik

2
我遇到了同样的问题。我的解决方法是将 docker build 附加到一个已知的工作且可访问的Docker网络上。
解决方法如下:
  • docker network ls
  • 选择一个已知的工作网络
  • docker build --network=<已知的工作网络名称>
默认情况下,Docker使用默认网络进行构建。手动设置网络可以确保网络可以访问互联网。"Workaround"翻译成"解决方法"。

2
哦,我的天啊!你的解决方案对我有用!让我在评论中解释一下我的情况,也许可以节省其他人的时间!我有一个 Jenkins 作业,它基于 Node.JS 镜像构建图像,我还使用私有注册表,该注册表与 Jenkins 在同一网络中,但由于某种原因,该作业无法默认使用 Docker 的网络。添加了这个 --network 标志后,该作业停止失败并发现了 npm 注册表。谢谢! - Egor Sazanovich
非常高兴它能帮助到某个人。 - vegasbrianc

1
我尝试了上面所有的方法,但都没有解决我的问题。好奇心引起的 dockerd systemd 脚本在添加 --dns 参数后没有启动。
在我的情况下,问题是在 Ubuntu 中 /etc/resolv.conf 是由 systemd-resolved 自动生成的,并指向本地 IP 127.0.0.53,其中运行着一个缓存 DNS,这很疯狂,但有了这个信息,容器会尝试在其环回接口中使用自己来解析 DNS。手动更改 resolv.conf 为我们公司的 LAN DNS 解决了该问题,然后修改 systemd-resolved 以永久执行此操作。

0
对我来说问题是,我的交换分区出了问题在调整根分区大小后几乎所有系统任务都要求我输入密码(如apt get命令、重新启动等)。

请为磁盘…(cryptswap1)输入密码

注意

只有当您也看到上述错误并且在尝试在docker容器内执行npm install时遇到描述中的问题时,请尝试以下方法:

错误:getaddrinfo ENOTFOUND/EAI_AGAIN registry.npmjs.org registry.npmjs.org:443

解决方案

  1. 打开GParted并检查您的交换分区所在位置,例如/dev/sda5(称为“SWAP_PARTITION”)
  2. 编辑/etc/crypttab并替换UUID=****以获得以下模式:

    cryptswap1 /dev/SWAP_PARTITION/ /dev/urandom swap,**,cipher=****

  3. 重新启动,如果仍然要求输入密码,请继续:

  4. 执行命令sudo dd if=/dev/zero of=/dev/SWAP_PARTITION/ bs=512 count=20480并重新启动。这对我有用。

source


0

我正在跟随教程。当我复制所有文件时,这个错误不会发生在我身上:

# Specify base image
FROM node:alpine

WORKDIR /usr/app

# Install dependencies
COPY ./ ./
RUN npm install

# Default command
CMD ["npm", "start"]

当我先复制package.json,然后在npm install之后再复制其他文件时,这种情况就会发生:

# Specify base image
FROM node:alpine

WORKDIR /usr/app

# Install dependencies
COPY ./package.json ./
RUN npm install

COPY ./ ./

# Default command
CMD ["npm", "start"]

0

如果您能够ping/curl到npm注册表,但仍然在npm install时遇到错误,则该错误很可能是由于缺少ca-certs软件包引起的。在npm install之前将以下行添加到Dockerfile中,并重新构建镜像。

FROM node:alpine

# Installing cert package will allow resolving the error to https://registry.npmjs.org/
RUN apk add --no-cache ca-certificates

RUN npm install
CMD ["npm", "start"]

这导致出现错误:ERROR: 不可满足的约束条件: ca-certificates(缺失): 要求:world [ca-certificates] 命令 '/bin/sh -c apk add --no-cache ca-certificates' 返回了非零代码:1 - J. S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接