如何在容器中触发resolv.conf的重新加载



在启动时运行容器时,我注意到一些容器在systemd-resolve使用DHCP从默认值更新之前使用了resolv.conf。这意味着启动后过早启动的容器无法解决任何问题,需要重新启动才能使用正确的DNS设置。这是由于rkt和Docker的不同原因而发生的;Docker在容器内更新resolv.conf的方法与覆盖文件系统驱动程序不兼容,并且由于systemd-resolved不会在适当的位置更新文件(而是创建一个临时文件并重命名),rkt的绑定挂载不会更新容器看到的内容。

目前,我正在使用一个黑客系统。单位来延迟网络上线。目标是docker.service和我的rkt吊舱所依赖的。

[Unit]
Description=Wait for DNS
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/sh -c 'while ! getent ahosts google.com >dev/null; do sleep 1; done'
[Install]
WantedBy=network-online.target

但这大大延迟了我的启动时间

# systemd-analyze blame
18.068s wait-for-dns.service
...

如果resolv.conf再次更改,也无济于事。所以我想知道是否有一个更优雅的解决方案来解决我的问题。理想情况下,我希望每次更改时都能在rkt和Docker容器中触发resolv.conf更新。

在用户定义的网络上运行容器,以便它们使用嵌入式DNS服务器,该服务器将查找转发到系统DNS。

默认的docker0网桥有一些特殊的规则,这些规则是为旧版支持而保留的。使用挂载的/etc/resolv.conf就是其中一个遗留问题。

如果rkt不支持相同类型的DNS,那么一般的解决方案可能是设置一个像Unbound这样的DNS服务器作为本地转发解析程序。然后容器有一个静态DNS服务器可供参考。

相关内容

  • 没有找到相关文章

最新更新