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。有两种方法可以自动完成您在上面提出的修复:

  1. 命令行中的 --dns option 应该告诉 Docker 如何正确地创建所需的解析文件。
  2. You can overwrite the resolve file at start.

您也可以尝试找出为什么 Docker 搞砸了,但这可能是一个更复杂的问题。

通过采用 Docker Daemon CLI options 中使用的相同命名约定并将它们手动应用于 /etc/docker/daemon.json,然后重新启动,我至少能够让我的 docker 构建容器Docker 守护进程。

  1. 阅读主机/etc/resolv.config(你的可能会有所不同)
$ cat /etc/resolv.config
# Generated by expressvpn
search expressvpn
nameserver 10.53.0.1
  1. 新建一个,或者使用/etc/docker/daemon.json(我不得不使用超级用户来写文件)
$ sudo touch /etc/docker/daemon.json
  1. 使用守护程序文件手动将虚拟网络设置为主机 /etc/resolv.conf 输出,如 #1 中所述(同样,您的可能 有所不同)。您可以找到不同的选项 here 只需使用 CLI 选项作为键和以字符串作为值的数组。
{
    "dns": [
        "10.53.0.1"
    ],
    "dns-search": [
        "expressvpn"
    ]
}
  1. 硬停止全部docker处理
$ sudo ps axf | grep docker | grep -v grep | awk '{print "kill -9 " }' | sudo sh 
  1. 重启Docker守护进程
$ sudo dockerd

这不是最优雅的解决方案,但我至少能够 Docker 构建容器并继续我的工作。