docker npm install Error: getaddrinfo ENOTFOUND registry.npm



我在 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

为什么?当然,我可以从RHELping。

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" ]

和包.json

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

命令重新启动 docker 可以为我修复它,但我不知道为什么

sudo service docker restart

我根据这篇文章解决了这个问题 https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns

实际上,您可以在调用时检查DNS是否失败registry.npmjs.org

为了检查这一点,我做了这些步骤来使其工作

步骤 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

重新启动 docker 服务

>> sudo service docker restart

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

解决方法

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

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

我尝试了上述所有内容,但没有任何效果。好奇的dockerd systemd脚本在添加--dns参数时没有启动。

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

对我来说

,问题是,我的交换分区在调整根分区的大小后出现问题,并要求我提供几乎所有系统任务的密码短语(如 apt get 命令、重新/引导等)。

请输入磁盘的密码...(cryptswap1) on none

注意

仅当您也看到上述错误,并在尝试在 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执行命令并重新启动。这为我修复了它。

我正在学习一个教程。当我复制所有文件时,我不会发生此错误:

# 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"]

如果您能够 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"]

最新更新