我在 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
解决方案
- 打开 GParted 并检查您的交换分区挂载在哪个位置,例如/dev/sda5(引用为"SWAP_PARTITION")
编辑
/etc/crypttab
并替换UUID=****
以获取以下模式:cryptswap1 /dev/SWAP_PARTITION/ /dev/urandom swap,**,cipher=****
重新启动,如果系统仍要求您输入密码,请继续:
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"]