我想将域名条目添加到我的泊坞广告容器的/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
我尝试了echo
和sed
。
使用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工作。
答案 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