Jenkins流水线推送Docker镜像到私有仓库出现No such host错误如何解决
私有Docker Registry推送失败问题解决方案
错误根因
no such host报错:执行Jenkins任务的Agent节点无法解析<private-vm-name>对应的IP地址,Docker请求时无法定位到私有Registry所在主机;同时私有Registry默认走HTTP协议,Docker客户端默认优先用HTTPS访问,也会触发访问异常。AccessDeniedException报错:Jenkins服务运行用户(通常为jenkins)没有系统/etc/docker目录的写入权限,且就算写入成功,修改daemon.json后需要重启Docker服务才会生效,在流水线运行阶段动态修改属于无效操作。
解决步骤
- 处理主机名解析问题
二选一即可:
- 直接用私有Registry所在虚拟机的IP代替
<private-vm-name>,绕开域名解析步骤; - 在所有执行Jenkins任务的Agent节点的
/etc/hosts文件中添加<私有虚拟机IP> <private-vm-name>的映射规则。
- 提前配置Docker非安全Registry白名单
在所有Jenkins Agent节点上手动修改/etc/docker/daemon.json文件,添加私有Registry地址:
{ "insecure-registries": ["<私有Registry地址,例:192.168.1.100:5000>"] }
如果节点上已有daemon.json配置,只需将地址追加到已有insecure-registries数组中即可,不要直接覆盖原有配置。修改完成后执行systemctl restart docker重启Docker服务使配置生效。
- 修正Jenkinsfile配置
移除流水线中动态写入daemon.json的逻辑,修改后配置如下:
stage('Building docker image') { steps{ script { // registry变量替换为你的实际镜像路径,例:192.168.1.100:5000/temp/prototype-be dockerImage = docker.build registry + ":v1" } } } stage('Pushing docker image') { steps{ script { // 直接指定HTTP协议的Registry地址,无认证无需额外传凭证参数 docker.withRegistry( 'http://<你的Registry IP:5000>') { dockerImage.push() } } } }
如果执行时仍有Docker操作权限问题,在Agent节点执行usermod -aG docker jenkins将jenkins用户加入docker用户组,重启Jenkins服务后生效。
内容的提问来源于stack exchange,提问作者Andy Dufresne
相关产品推荐
相关产品推荐

