我们正在使用docker-compose从Docker容器运行Jenkins CI服务器。 Jenkins服务器正在运行一些作业,这些作业从git中提取项目并构建docker容器,这是标准方式在它们上执行docker build .
。为了能够在docker容器中使用docker,我们使用docker-compose将/var/run/docker.sock
挂载到Jenkins容器。
我们正在尝试构建的一些Dockerfile正在从我们的文件服务器下载文件(例如第三方安装映像)。这样的Dockerfile命令看起来像RUN curl -o xx.zip http://fileserver/xx-1.2.3.zip
。
fileserver
主机名通过/etc/hosts
文件解析,并解析为运行Jenkins CI服务器的主机公共IP。 Jenkins容器的docker-compose配置还包括extra_hosts
参数,指向fileserver
到主机的公共IP。
问题是,使用Jenkins在自己的容器中运行构建docker容器会失败,并显示一条简单的Unknown host: fileserver
消息。如果我通过docker exec -it <id>
输入Jenkins容器,我可以执行相同的curl
命令并解析主机,但如果我尝试运行docker build .
,那么尝试运行相同的curl命令,它无法解析主机。
我们的主机是RHEL,我无法在我的桌面Arch Linux上重现这个问题,因此我怀疑这是特定于redhat的问题(再次)。
答案 0 :(得分:0)
Docker构建不会发生在发出命令的机器上(在这种情况下是你的jenkins容器) - 它们发生在带有Docker Engine的机器上。这意味着您的Jenkins机器会将源目录更新并将其发送回父计算机以进行构建。因此,检查curl命令是否来自父机器,而不是Jenkins容器。