resolv.conf 构建 Docker 容器时似乎总是出错
resolv.conf seems to always be wrong when building Docker container
我正在尝试编写 Dockerfile
说明来使用 yum
并安装一些软件包。当我 运行 我的构建命令时,我总是会得到一个错误...
(28, 'Resolving timed out after 5000 milliseconds')
...由于无法访问网络。我比较了主机和容器 /etc/resolv.conf
,发现它们不同。
示例(主机)
# Generated by expressvpn
search expressvpn
nameserver 10.53.0.1
示例(容器)
search expressvpn
nameserver 10.1.2.3
nameserver 8.8.8.8
我尝试复制主机 /etc/resolv.conf
并覆盖容器 /etc/resolv.conf
,如下所示
$ echo "# Generated by expressvpn
> search expressvpn
> nameserver 10.53.0.1" > "/etc/resolv.conf"
然后立即再次获得网络访问权限并能够使用yum
。但是,如果我尝试使用构建命令读取 Dockerfile
,它似乎不再起作用了。如何让 docker 在构建时使用主机 resolv.conf
或正确解决此问题?之前我的 VPN 似乎没有问题。现在是这个问题吗?
Docker 覆盖 resolve.conf
文件,因此它与正在设置的虚拟网络相匹配。您的容器的非典型网络设置可能会搞砸 Docker。有两种方法可以自动完成您在上面提出的修复:
- 命令行中的
--dns
option 应该告诉 Docker 如何正确地创建所需的解析文件。
- You can overwrite the resolve file at start.
您也可以尝试找出为什么 Docker 搞砸了,但这可能是一个更复杂的问题。
通过采用 Docker Daemon CLI options 中使用的相同命名约定并将它们手动应用于 /etc/docker/daemon.json
,然后重新启动,我至少能够让我的 docker 构建容器Docker 守护进程。
- 阅读主机
/etc/resolv.config
(你的可能会有所不同)
$ cat /etc/resolv.config
# Generated by expressvpn
search expressvpn
nameserver 10.53.0.1
- 新建一个,或者使用
/etc/docker/daemon.json
(我不得不使用超级用户来写文件)
$ sudo touch /etc/docker/daemon.json
- 使用守护程序文件手动将虚拟网络设置为主机
/etc/resolv.conf
输出,如 #1 中所述(同样,您的可能 有所不同)。您可以找到不同的选项 here 只需使用 CLI 选项作为键和以字符串作为值的数组。
{
"dns": [
"10.53.0.1"
],
"dns-search": [
"expressvpn"
]
}
- 硬停止全部docker处理
$ sudo ps axf | grep docker | grep -v grep | awk '{print "kill -9 " }' | sudo sh
- 重启Docker守护进程
$ sudo dockerd
这不是最优雅的解决方案,但我至少能够 Docker 构建容器并继续我的工作。
我正在尝试编写 Dockerfile
说明来使用 yum
并安装一些软件包。当我 运行 我的构建命令时,我总是会得到一个错误...
(28, 'Resolving timed out after 5000 milliseconds')
...由于无法访问网络。我比较了主机和容器 /etc/resolv.conf
,发现它们不同。
示例(主机)
# Generated by expressvpn
search expressvpn
nameserver 10.53.0.1
示例(容器)
search expressvpn
nameserver 10.1.2.3
nameserver 8.8.8.8
我尝试复制主机 /etc/resolv.conf
并覆盖容器 /etc/resolv.conf
,如下所示
$ echo "# Generated by expressvpn
> search expressvpn
> nameserver 10.53.0.1" > "/etc/resolv.conf"
然后立即再次获得网络访问权限并能够使用yum
。但是,如果我尝试使用构建命令读取 Dockerfile
,它似乎不再起作用了。如何让 docker 在构建时使用主机 resolv.conf
或正确解决此问题?之前我的 VPN 似乎没有问题。现在是这个问题吗?
Docker 覆盖 resolve.conf
文件,因此它与正在设置的虚拟网络相匹配。您的容器的非典型网络设置可能会搞砸 Docker。有两种方法可以自动完成您在上面提出的修复:
- 命令行中的
--dns
option 应该告诉 Docker 如何正确地创建所需的解析文件。 - You can overwrite the resolve file at start.
您也可以尝试找出为什么 Docker 搞砸了,但这可能是一个更复杂的问题。
通过采用 Docker Daemon CLI options 中使用的相同命名约定并将它们手动应用于 /etc/docker/daemon.json
,然后重新启动,我至少能够让我的 docker 构建容器Docker 守护进程。
- 阅读主机
/etc/resolv.config
(你的可能会有所不同)
$ cat /etc/resolv.config
# Generated by expressvpn
search expressvpn
nameserver 10.53.0.1
- 新建一个,或者使用
/etc/docker/daemon.json
(我不得不使用超级用户来写文件)
$ sudo touch /etc/docker/daemon.json
- 使用守护程序文件手动将虚拟网络设置为主机
/etc/resolv.conf
输出,如 #1 中所述(同样,您的可能 有所不同)。您可以找到不同的选项 here 只需使用 CLI 选项作为键和以字符串作为值的数组。
{
"dns": [
"10.53.0.1"
],
"dns-search": [
"expressvpn"
]
}
- 硬停止全部docker处理
$ sudo ps axf | grep docker | grep -v grep | awk '{print "kill -9 " }' | sudo sh
- 重启Docker守护进程
$ sudo dockerd
这不是最优雅的解决方案,但我至少能够 Docker 构建容器并继续我的工作。