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

时间:2017-11-14 23:54:48

标签: docker dns systemd rkt

在启动时运行容器时,我注意到有些人在使用DHCP之前使用resolv.conf在默认情况下更新了它。这意味着启动后过早启动的容器无法解决任何问题,需要重新启动才能使用正确的DNS设置。出于rkt和Docker的不同原因,这种情况正在发生; Docker在容器内更新resolv.conf的方法是not compatible with the overlay filesystem driver,因为systemd-resolved不会就地更新文件(而是创建临时文件并重命名)rkt的bind挂载不会更新容器看到的内容。

目前我正在使用hacky systemd.unit来延迟network-online.target这个docker.service和我的rkt pod所依赖的。

[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再次更改它将无济于事。所以我想知道我的问题是否有更优雅的解决方案。 Idealy我希望每次更改时都能在rkt和Docker容器中触发resolv.conf更新。

1 个答案:

答案 0 :(得分:0)

user defined network上运行容器,以便他们使用embedded DNS server将查找转发到系统DNS。

默认的docker0网桥有一些特殊规则可用于传统支持。使用已安装的/etc/resolv.conf是其中一项遗留问题。

如果rkt不支持相同类型的DNS,那么通常的解决方案可能是将Unbound之类的DNS服务器设置为local forwarding resolver。然后容器有一个静态DNS服务器来引用。