由于原因我无法确定应用于Linux容器的docker的默认名称服务器地址导致无法解析和外部地址。我正在尝试使用resolv.conf文件上的sed命令更新名称服务器地址,但在命令运行之后,docker似乎删除了运行它的映像,导致名称服务器未更新。
当docker build在我的Windows机器上创建一个Linux容器时,生成的容器在resolv.conf中的名称服务器值为192.168.65.1。我无法解决任何uris问题。我甚至无法ping google.com。如果我更新名称服务器以使用Google的DNS,8.8.8.8,我可以ping其他主机并成功运行启动该问题的命令(dotnet restore)。
我构建了一个将我的文件复制到/ src中的图像,然后以交互方式运行它以尝试调试。我通过运行以下命令修复了我的问题
# copy resolv.conf because I can't run sed on it directly
RUN cp /etc/resolv.conf /etc/resolv.conf.temp
# make my change to the temp file
RUN sed -i 's/192.168.65.1/8.8.8.8/' /etc/resolv.conf.temp
# copy the modified file over original
RUN cp /etc/resolv.conf.temp /etc/resolv.conf
在容器中以交互方式运行,然后我可以在我的src文件上成功调用dotnet restore。
但是,当我在Dockerfile中包含这些指令并构建映像时,复制发生,sed命令在临时文件上发生,并且复制命令似乎发生但生成的映像仍然具有原始的192.168.65.1名称服务器值。
在第二个cp之后添加此命令:
RUN cat /etc/resolv.conf
确认运行cat命令时,原始resolv.conf内容完好无损。
以下是构建输出的相关部分:
Step 9/12 : RUN cp /etc/resolv.conf /etc/resolv.conf.temp
---> Running in cf8e037f5675
Removing intermediate container cf8e037f5675
---> 53f1c8bb86c6
Step 10/12 : RUN sed -i 's/192.168.65.1/8.8.8.8/' /etc/resolv.conf.temp
---> Running in 14b6a8381261
Removing intermediate container 14b6a8381261
---> 22039e11f812
Step 11/12 : RUN cp /etc/resolv.conf.temp /etc/resolv.conf
---> Running in 46d295d869bf
Removing intermediate container 46d295d869bf
---> ea1a18576f87
Step 12/12 : RUN cat /etc/resolv.conf
---> Running in 6cb4726e58cb
# This configuration is written to the config.iso
nameserver 192.168.65.1
search mycompany.local
domain mycompany.local
Removing intermediate container 6cb4726e58cb
---> 5ad060514a74
Successfully built 5ad060514a74
我希望构建的图像具有从步骤10和11设置的新的名称服务器值,但事实并非如此,看起来工作正在发生但是中间图像被丢弃,我不明白为什么以及正确修复了什么是。
可以通过将名称服务器传递给docker守护程序来将其添加到docker容器中。
在文件/etc/docker/daemon.json中,添加"dns":["172.16.3.241", "127.0.0.1", "8.8.8.8", "8.8.4.4"]
或将dns
添加到docker守护进程中。
您可以在构建其映像后更改容器的DNS设置,参见--dns 127.0.0.1 --dns 8.8.8.8 --dns 8.8.4.4
。
最小的例子:
Dockerfile:
the Docker docs
在同一文件夹中,运行:
FROM alpine
CMD ["cat", "/etc/resolv.conf"]
输出将显示:
docker build --tag foo . && docker run --rm --dns-search=foo.bar --dns=8.8.8.8 foo