【问题标题】:Hostname resolution fails when running docker build from a docker container从 docker 容器运行 docker build 时主机名解析失败
【发布时间】:2024-04-14 23:50:01
【问题描述】:

我们从 docker 容器运行 Jenkins CI 服务器,从 docker-compose 开始。 Jenkins 服务器正在运行一些作业,这些作业从 git 中提取项目并以标准方式在它们上执行 docker build . 构建 docker 容器。为了能够在 docker 容器中使用 docker,我们通过 docker-compose 将 /var/run/docker.sock 挂载到 Jenkins 容器中。

我们正在尝试构建的一些 Dockerfile-s 正在从我们的文件服务器下载文件(例如,第 3 方安装映像)。这样的 Dockerfile 命令看起来像 RUN curl -o xx.zip http://fileserver/xx-1.2.3.zip

fileserver 主机名通过/etc/hosts 文件解析,并解析为运行 Jenkins CI 服务器的主机的公共 IP。 Jenkins 容器的 docker-compose 配置还包括将 fileserver 指向主机公共 IP 的 extra_hosts 参数。

问题是构建 docker 容器并在其自己的容器中运行 Jenkins 失败,并显示纯 Unknown host: fileserver 消息。如果我通过docker exec -it <id> 进入Jenkins 容器,我可以执行相同的curl 命令并解析主机,但如果我尝试在那里运行docker build . 并尝试运行相同的curl 命令,则无法解析主持人。

我们的主机是 RHEL,我未能在我的桌面 Arch Linux 上重现该问题,所以我怀疑这是 redhat 特有的问题(再次)。

【问题讨论】:

    标签: networking docker redhat rhel docker-compose


    【解决方案1】:

    Docker 构建不会发生在发出命令的机器上(在这种情况下是您的 jenkins 容器) - 它们发生在带有 Docker 引擎的机器上。这意味着您的 Jenkins 机器会压缩源目录并将其发送回父机器以进行构建。因此,请检查 curl 命令是否在父计算机上工作,而不是在 Jenkins 容器中工作。

    【讨论】:

    • 主机可以完美解析并到达fileserver主机,它是它自己的/etc/hosts文件中指向外部IP地址之一的别名之一(所以不是127.0.0.1)
    • 如果有帮助,主机是 RedHat Enterprise Linux 服务器。显然我们的设置适用于其他地方(例如在我的桌面 archlinux 上),但不适用于这个 RHEL ..(是的,我关闭了 SELinux)
    • 对不起 Kristof- 这用光了我的好主意 :( 我已经使用 jenkins 在带有 ubuntu 主机的主机 docker daemon 上构建图像,但我并没有过多地使用 RHEL。
    【解决方案2】:

    添加--network=host,以便构建环境使用宿主机域解析。

    docker build --network=host foo/bar:latest .
    

    【讨论】: