docker npm install错误:getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443

时间:2016-02-19 21:18:31

标签: node.js docker

我在RHEL 7上使用docker版本1.10.1并在使用Dockerfile下面时获取npm install错误。错误: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 个答案:

答案 0 :(得分:8)

使用此命令重新启动docker会为我修复它,但我不知道为什么

sudo service docker restart

答案 1 :(得分:3)

我根据这篇文章https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns

解决了这个问题

实际上,您可以在调用registry.npmjs.org

时检查DNS是否失败

为了检查那件事,我做了这些步骤让它发挥作用

第1步

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

第2步

从第1步结果可以看出,我收到错误并且无法解析与google.com的连接,如果您遇到类似错误,请执行此操作以检查当前的DNS路由。

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

该命令公开了您的IP4 DNS,在这种情况下192.168.2.1,在此步骤中您已经知道DNS。

第3步

让我们继续使用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
    ....

第4步

如果您的结果与步骤3类似,那么您的问题是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
}

第5步

重新启动泊坞窗服务

>> sudo service docker restart

答案 2 :(得分: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并重新启动。这为我修好了。
  5. source

答案 3 :(得分: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"]

答案 4 :(得分: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"]

答案 5 :(得分:0)

我遇到了同样的问题。我的解决方法是将docker build附加到一个已知的可运行且可访问的Docker网络。

解决方法

  • docker network ls
  • 选择一个已知的工作网络
  • docker build --network=<known working network name>

默认情况下,Docker使用默认网络进行构建。手动设置网络可确保网络可以访问互联网。

答案 6 :(得分:0)

我尝试了以上所有内容,但对我没有任何帮助。添加--dns参数时,好奇的dockerd systemd脚本未启动。

在我的情况下,问题是在ubuntu中,/etc/resolv.conf由systemd-resolved自动生成,并指向运行缓存DNS的本地ip 127.0.0.53,这很疯狂,但是有了此信息,容器尝试在其Loopack界面中自行解析DNS。在局域网中手动将resolv.conf更改为我们公司的DNS可解决此问题,然后修改systemd-resolved使其永久解决。