【问题标题】:unable to edit /etc/resolv.conf in docker container无法在 docker 容器中编辑 /etc/resolv.conf
【发布时间】:2017-04-23 07:10:02
【问题描述】:

我想向我的 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 正常工作。

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

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

    Docker 如何为每个容器提供主机名和 DNS 配置,而无需构建包含主机名的自定义镜像?它的技巧是用虚拟文件覆盖容器内的三个关键 /etc 文件,它可以在其中写入新信息……这种安排允许 Docker 做一些聪明的事情,比如当主机接收到新配置时,让所有容器保持最新的 resolv.conf DHCP 稍后。 Docker 如何在容器内维护这些文件的具体细节可能会从一个 Docker 版本更改为下一个版本,因此您应该不理会文件本身,而是使用以下 Docker 选项。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-05-07
        • 2016-10-18
        • 2016-08-22
        • 2022-01-25
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        相关资源
        最近更新 更多