无法在Docker容器中编辑/etc/resolv.conf

14

我想在我的Docker容器的/etc/resolv.conf中添加一个域名条目。

这是我的Dockerfile:

FROM tomcat:8.0.20-jre7
VOLUME /tmp
#RUN sed -i "s|search local|domain com.example.com|g;" /etc/resolv.conf
RUN echo "domain com.example.com" >> /etc/resolv.conf
# Expose ports.
EXPOSE 8080

我尝试了echosed。 用sed时,在构建过程中出现错误。

sed: cannot rename /etc/sed6LcoES: Device or resource busy

但是用echo容器可以成功构建和运行。 但是,当我进入容器时,我没有看到我的域名添加在/etc/resolv.conf中。

为什么不起作用?

注意:我已经通过传递运行参数来使dns-search正常工作:

docker run -p 8080:8080 --dns-search=com.example.com -d --name myawesome my/myawesome:latest

但我想让dockerFile工作。

2个回答

11

这是故意设计的。Docker引擎使用/etc/resolv.conf来处理服务发现。文档中指出:

Docker如何为每个容器提供主机名和DNS配置,而无需构建将主机名写在内部的自定义镜像?它的技巧是在容器内叠加三个关键的/etc文件,用虚拟文件覆盖它们,Docker可以写入新鲜信息... 这种安排使得Docker能够聪明地执行一些操作,例如在主机机器后来接收到新的DHCP配置时,在所有容器中保持resolv.conf更新。 Docker在容器内维护这些文件的确切细节可能会从一个Docker版本变化到下一个,因此您应该不要更改这些文件本身,而是使用以下Docker选项。

如果您想覆盖/重新配置某些DNS设置,请在启动容器时使用--dns参数。了解更多详情,请参阅:


4

可以通过尝试以下代码来解决使用标准输出流的问题。将命名空间部分更正为自己的DNS服务器IP,但这仅在容器运行时有效:

echo "$(sed '2,$c nameserver 223.5.5.5\nnameserver 223.6.6.6' /etc/resolv.conf)" > /etc/resolv.conf

sed命令实际上不会修改文件,而是创建一个新文件来替换原始文件(因此可以通过vim编辑它)。由于/etc/resolve.conf已挂载,替换原始文件将通知设备该文件正在使用中。

您可以通过命令df -ah观察文件的挂载情况:

Filesystem      Size  Used Avail Use% Mounted on
overlay          59G  7.5G   49G  14% /
...
mqueue             0     0     0    - /dev/mqueue
shm              64M     0   64M   0% /dev/shm
/dev/sda1        59G  7.5G   49G  14% /etc/resolv.conf
....

在运行docker镜像时,可以正确指定容器的DNS服务器IP:

$ docker run --help|grep dns
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains

$ docker run -it --rm --dns=223.5.5.5 --dns=223.6.6.6 centos:perf-tools /bin/bash
[root@ea0ac0fcd834 /]# cat /etc/resolv.conf
nameserver 223.5.5.5
nameserver 223.6.6.6

此外,DNS服务器IP地址可以根据docker-composer.yml配置文件进行修改:

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

更多信息请参见:https://docs.docker.com/v17.09/compose/compose-file/#dns


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接