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

时间:2016-12-08 06:00:01

标签: docker dockerfile

我想将域名条目添加到我的泊坞广告容器的/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 个答案:

答案 0 :(得分:7)

这是设计的。 docker引擎使用/etc/resolv.conf来处理服务发现。文档说明如下:

  

Docker如何为每个容器提供主机名和DNS配置,而无需使用内部编写的主机名构建自定义映像?它的诀窍是用虚拟文件覆盖容器内的三个关键/ etc文件,它可以写出新的信息......这种安排允许Docker做一些聪明的事情,例如当主机接收到新配置时,保持resolv.conf在所有容器中保持最新状态DHCP以后。 Docker如何在容器中维护这些文件的确切细节可以从一个Docker版本更改为下一个版本,因此您应该单独保留文件并使用以下Docker选项。

如果要覆盖/重新配置某些dns设置,请在容器启动期间使用--dns参数。查看更多详情:

答案 1 :(得分:0)

使用标准输出流可以通过尝试以下代码来解决,将名称空间部分更正为其自己的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

此外,可以基于docker-composer.yml配置文件来修改DNS服务器IP:

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

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