【发布时间】:2019-09-12 05:37:34
【问题描述】:
由于无法确定应用于 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 命令发生在临时文件上,并且 copyover 命令似乎发生了,但生成的映像仍然具有原始的 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 设置的新名称服务器值,但事实并非如此,看起来工作正在进行中,但中间映像被丢弃,我不明白为什么以及是什么正确的解决方法是。
【问题讨论】:
-
Dockerfile 的基础镜像是什么?
-
microsoft/dotnet:2.2-sdk
-
在这里使用
sed -i完全没有意义。-i本身告诉sed创建一个临时文件,将更改写入其中,然后用该临时文件覆盖原始文件。为什么要使用该操作修改本身就是一个临时文件的东西,而不是直接在/etc/resolv.conf上使用sed -i? -
@CharlesDuffy 关于为什么我首先在原始 resolv.conf 上创建临时文件而不是 sed -i。根据this unix.se question中的响应者,不允许更改 docker inode。我得到了在尝试在最初安装的文件上运行 sed -i 的问题中描述的相同行为。 unix.stackexchange.com/questions/404189/…
标签: docker dockerfile