Docker覆盖了容器中的/etc/resolv.conf文件


17

我想将resin/rpi-raspbian:jessie容器设置/etc/resolv.conf为:

nameserver 208.67.222.222
nameserver 208.67.220.220

我的Dockerfile包含以下行:

ADD resolv.conf /etc/resolv.conf

此添加的文件包含正确的名称服务器。

我的Docker主机/etc/resolv.conf包含正确的信息。

我正在像这样运行容器:

docker run -itd --cap-add=NET_ADMIN --device /dev/net/tun \
-v /home/pi/share/ovpn:/ovpn \
--privileged --network=internet_disabled --name vpn-client \
--dns=208.67.222.222 \
openvpn-client_nat-gateway /bin/bash

尽管如此,容器仍提供以下输出:

root@642b0f4716ba:/# cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

只有在我从容器内(或使用docker exec)手动更改resolv.conf后,它才看起来正确。

我宁愿避免使用exec命令对其进行修复。有人知道这里发生了什么吗?


他们的Wiki上描述了一些案例,可以解释您的情况。
Julie Pelletier

看看我的问题和答案。
Zeinab Abbasimazar

Answers:


14

AFAIK,泊坞窗在启动时会覆盖映像中的某些文件,即使它们已添加到Dockerfile中也是如此。可以肯定的是/etc/hosts,这也包括在内/etc/resolv.conf。显然,这是用来正确构建Docker的默认“内部”网络(以便图像可以互相看到,但不能与主机等)。如果您确实确定要覆盖/修改其中的某些文件,我相信您必须将其作为运行时操作的一部分,即作为CMD行的一部分。例如:

...
ADD resolv.conf /etc/resolv.conf.override
CMD cp /etc/resolv.conf.override /etc/resolv.conf && \
        your_old_commands...

3
这是对的。/etc/resolv.conf启动容器时从主机复制。
wisbucky

4

如我所见,您正在使用user-defined networksDocker Engine版本> = 1.10。因此,从官方docker引擎文档中可以了解到Embedded DNS server in user-defined networks

这些--dns IP地址由嵌入式DNS服务器管理,不会在容器的/etc/resolv.conf文件中更新。

您的dns必须正常工作,但是在任何配置文件中都看不到。

参考文献


0

如果它是Azure中容器的Web应用程序,我已经解决了问题。

2个容器伴侣。Kudu和房东

脚步

1.从您的docker文件安装ssh(还包括sshd配置)

2.创建一个containerstart.sh(更新resolv.conf)

3.在里面设置入口点

现在,主机resolv.conf已更新,您可以使用所需的任何dns

PS:如果您无法在网络中使用自定义DNS,请不要担心。我们也不能。如果您使用的是ASE环境,则可能需要重置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.