在OpenShift Jenkins容器中Docker构建时wget下载特定URL超时问题
关于wget在特定URL挂起的问题分析与解决思路
从你给出的调试日志和场景来看,第二个wget请求已经成功建立TCP连接,但卡在等待HTTP响应的阶段,而且换了多个Docker版本都没解决,另一个集群却正常,说明问题基本和Docker版本无关,大概率出在网络层面——要么是你的OpenShift集群的网络配置,要么是目标服务器对集群出口的限制。下面分几个方向给你拆解:
1. 目标服务器的访问限制
目标地址mumps.enseeiht.fr解析到的IP是147.127.176.144,很可能是这个服务器的防火墙、WAF或者流量策略拦截了你的集群出口IP:
- 你的两个OpenShift集群用的是不同的公网出口IP,其中一个在目标服务器的允许列表里,另一个被挡了;
- 从集群到这个服务器的网络链路有丢包、高延迟,导致TCP连接建立后,响应无法正常传回。
排查方法:
- 找集群管理员,在集群的节点机器上直接执行
wget http://mumps.enseeiht.fr/MUMPS_4.10.0.tar.gz,看能不能下载,先确认集群出口的连通性; - 用
traceroute 147.127.176.144或者mtr 147.127.176.144检查网络路径,看看中间哪个节点出现异常。
2. OpenShift的网络配置问题
集群层面的网络限制也可能导致这个情况:
- 全局代理设置:如果集群配置了HTTP代理,而代理服务器无法访问目标URL,或者没把这个域名加入白名单,就会卡住;第一个URL可能刚好在代理允许范围内,所以没问题;
- NetworkPolicy规则:Jenkins所在的项目如果配了严格的NetworkPolicy,可能只允许访问特定外部域名,
mumps.enseeiht.fr不在列表里,请求被拦截了; - SDN插件问题:OpenShift用的SDN(比如OpenShift SDN、Calico)如果有规则错误,可能会阻塞容器到这个特定IP的流量。
解决思路:
- 检查集群代理:查看
openshift-config命名空间下的proxy资源,确认代理配置是否包含这个域名的访问权限; - 检查项目的NetworkPolicy:执行
oc get networkpolicy -n <你的Jenkins项目名>,看看有没有拒绝外部流量的规则,需要的话添加允许访问147.127.176.144的规则; - 直接进容器测试:用
oc rsh <Jenkins的Pod名>进入容器,执行curl -v http://mumps.enseeiht.fr/MUMPS_4.10.0.tar.gz,看能不能拿到响应,判断是容器内还是集群层面的问题。
3. 容器内的网络细节问题
虽然Docker版本换了,但ubi8镜像里的网络设置或者wget的参数可能有影响:
- 目标服务器可能对长连接不友好:你的wget用的是
Connection: Keep-Alive,换成短连接试试; - wget的请求头不符合服务器要求:比如User-Agent或者其他字段,换curl工具试试能不能绕过。
修改Dockerfile尝试:
- 给wget加
--no-keep-alive参数,强制短连接:RUN wget --debug --no-keep-alive http://mumps.enseeiht.fr/MUMPS_4.10.0.tar.gz - 换成curl下载:
RUN dnf install -y curl && curl -v http://mumps.enseeiht.fr/MUMPS_4.10.0.tar.gz -o MUMPS_4.10.0.tar.gz
4. 目标服务器本身的问题
也有可能是目标服务器的临时故障:
- 自己在浏览器或者其他网络环境下访问这个URL,确认资源是不是正常能下载;
- 查一下这个服务器有没有维护公告,或者资源是不是更换了存储位置。
总的来说,最可能的原因是集群出口IP被目标服务器拦截或者OpenShift的网络策略/代理没配置对,建议先从集群层面的网络连通性排查,再一步步缩小范围到容器内部。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

