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

bra*_*orm 5 docker dockerfile

我想为/etc/resolv.conf我的docker容器添加一个域条目.

这是我的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
Run Code Online (Sandbox Code Playgroud)

我想这两个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工作.

Iva*_*lov 8

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

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

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


Rod*_*rry 5

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

\n\n
echo "$(sed \'2,$c nameserver 223.5.5.5\\nnameserver 223.6.6.6\' /etc/resolv.conf)" > /etc/resolv.conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

sed命令实际上并不修改文件,而是创建一个新文件来替换原始文件。(所以用vim编辑它是可以的)。因为/etc/resolve.conf已挂载,替换原始文件会通知设备正忙。

\n\n

您可以通过命令观察正在挂载的文件df -ah

\n\n
Filesystem      Size  Used Avail Use% Mounted on\noverlay          59G  7.5G   49G  14% /\n...\nmqueue             0     0     0    - /dev/mqueue\nshm              64M     0   64M   0% /dev/shm\n/dev/sda1        59G  7.5G   49G  14% /etc/resolv.conf\n....\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n
$ docker run --help|grep dns\n      --dns list                       Set custom DNS servers\n      --dns-option list                Set DNS options\n      --dns-search list                Set custom DNS search domains\n\n$ docker run -it --rm --dns=223.5.5.5 --dns=223.6.6.6 centos:perf-tools /bin/bash\n[root@ea0ac0fcd834 /]# cat /etc/resolv.conf\nnameserver 223.5.5.5\nnameserver 223.6.6.6\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

另外,可以根据docker-composer.yml配置文件修改DNS服务器IP:

\n\n
dns: 8.8.8.8\ndns:\n  - 8.8.8.8\n  - 9.9.9.9\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n