在启动时运行容器时,我注意到一些在 systemd-resolved 使用 DHCP 从默认值更新之前使用 resolv.conf。这意味着启动后过早启动的容器无法解决任何问题,需要重新启动才能使用正确的 DNS 设置。对于 rkt 和 Docker 来说,发生这种情况的原因各不相同;Docker 更新容器内 resolv.conf 的方法与覆盖文件系统驱动程序不兼容,并且由于 systemd-resolved 不会就地更新文件(而是创建一个临时文件并重命名),rkt 的绑定安装不会更新容器看到的内容。
目前我正在使用一个 hacky systemd.unit 来延迟 docker.service 和我的 rkt pod 所依赖的 network-online.target。
[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 更新。