Jenkins环境下Azure Container Registry镜像拉取失败:dial tcp lookup无此主机
解决Jenkins服务器上Azure Container Registry镜像拉取DNS解析失败的问题
这个问题我之前帮同事排查过,核心就是Jenkins服务器没法解析你的Azure容器注册表(ACR)域名,咱们一步步来定位解决:
第一步:确认DNS解析是否真的失败
先在Jenkins服务器上手动跑一下解析命令,验证是不是真的找不到域名:
nslookup simplimedpoc.azurecr.io # 或者用dig(Linux环境) dig simplimedpoc.azurecr.io
如果返回no such host,那实锤是DNS解析的问题;如果能正常返回IP,那再往下排查其他可能性。
第二步:检查Jenkins服务器的DNS配置
报错里的168.63.129.16是Azure内部的DNS服务器——如果你的Jenkins服务器不在Azure云环境里,用这个DNS肯定解析不了ACR的公网域名。
- Linux服务器:查看
/etc/resolv.conf文件,看看里面的DNS服务器是不是公共DNS(比如8.8.8.8、1.1.1.1)或者你的企业内部DNS;如果不是,修改这个文件或者通过网络管理工具更新DNS配置。 - Windows服务器:打开网络适配器属性,检查IPv4设置里的DNS服务器地址,换成能正常解析公网域名的地址。
第三步:如果Jenkins跑在Docker容器里
很多时候Jenkins是部署在Docker容器中的,这时候容器的DNS配置可能和宿主机不一致:
- 进入Jenkins容器内部,检查
/etc/resolv.conf的DNS设置; - 重启Jenkins容器时,手动指定DNS服务器参数:
docker run --dns 8.8.8.8 [你的Jenkins容器其他启动参数]
第四步:临时绕过DNS(验证用)
如果着急验证是不是DNS的锅,可以手动在Jenkins服务器的hosts文件里添加域名映射:
- 找一台能正常解析
simlimedpoc.azurecr.io的机器,拿到它的公网IP; - Linux:编辑
/etc/hosts,添加一行:[ACR公网IP] simplimedpoc.azurecr.io; - Windows:编辑
C:\Windows\System32\drivers\etc\hosts,同样添加上述映射; - 再尝试拉取镜像,如果成功了,就完全确认是DNS解析的问题,再回头完善DNS配置。
第五步:排除其他干扰
- 刷新DNS缓存:Linux用
systemd-resolve --flush-caches,Windows用ipconfig /flushdns; - 检查服务器防火墙/安全组:有没有阻止UDP 53端口(DNS请求用的是这个端口),导致没法向外发送解析请求;
- 确认ACR状态:虽然推送成功,但还是可以去Azure门户看看ACR是不是正常运行,有没有设置私有端点限制(不过如果是私有端点的问题,报错应该是连接超时而非DNS失败,优先级较低)。
内容的提问来源于stack exchange,提问作者rohan gupta
相关产品推荐
相关产品推荐

