Docker DNS忽略主机上的/etc/nsswitch.conf

Docker DNS忽略主机上的/etc/nsswitch.conf,docker,nginx,networking,Docker,Nginx,Networking,我有一个/etc/nsswitch.conf文件,该文件添加了libvirt nss,以便在主机和来宾机上自动解析vm主机名。然后,我在主机上运行了一个nginx容器(带有--networkhost),它将流量路由到主机上的一些服务,其余的路由到虚拟机。然而,nginx容器无法解析虚拟机的主机名,我怀疑docker引擎(?)不尊重主机的/etc/nsswitch.conf来解析域名。有什么办法可以让这一切顺利进行,还是我运气不佳?正如@DavidMaze所指出的,这是有意为之。有几种方法可以实现

我有一个
/etc/nsswitch.conf
文件,该文件添加了
libvirt nss
,以便在主机和来宾机上自动解析vm主机名。然后,我在主机上运行了一个nginx容器(带有
--networkhost
),它将流量路由到主机上的一些服务,其余的路由到虚拟机。然而,nginx容器无法解析虚拟机的主机名,我怀疑docker引擎(?)不尊重主机的
/etc/nsswitch.conf
来解析域名。有什么办法可以让这一切顺利进行,还是我运气不佳?

正如@DavidMaze所指出的,这是有意为之。有几种方法可以实现你似乎想做的事情

您可以将
nsswitch.conf
文件添加到容器中。这在阿尔卑斯山确实有效。在
Dockerfile
中复制或使用绑定挂载:

$ docker run --rm -v /etc/nsswitch.conf:/etc/nsswitch.conf --add-host foobar.dns:8.8.8.8 busybox ping foobar.dns
PING foobar.dns (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=113 time=7.796 ms
64 bytes from 8.8.8.8: seq=1 ttl=113 time=7.809 ms
然后可以使用
docker--addhost
将主机名添加到容器的
主机文件中。或者,也可以绑定主机的
主机
文件:

$ docker run --rm -v /etc/nsswitch.conf:/etc/nsswitch.conf -v /etc/hosts:/etc/hosts busybox ping foobar.dns
PING foobar.dns (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=113 time=16.961 ms

容器有自己的
/etc/nsswitch.conf
文件;基于阿尔卑斯山的映像可能根本无法实现这一点(因为它具有相当小的libc实现)。对于这个特定的设置,您可能会发现直接在主机上运行Nginx更简单。在我的问题中忘了提到,但我确实使用
--network host
运行容器,但这不行it@rosengrenen你是对的,
——网络主机本身不起作用,但是在答案中可以看到我的扩展示例。我尝试了类似的方法,但没有完全奏效,因为我在
/etc/nsswitch.conf
的hosts部分有
libvirt
libvirt\u guest
条目,和
libvirt nss
virsh
,所有这些东西在容器中都不可用,因此在尝试解析域时,它只会抛出一个系统错误。正如@davidmaze在对我的问题的评论中提到的,在这种特殊情况下,我可能不得不在没有docker的主机上运行nginx