无法通过Jenkins推送Docker镜像至Artifactory仓库,请求排查
解决Jenkins推送Docker镜像到Artifactory时出现EOF错误的问题
从你的日志和描述来看,手动在Jenkins从节点推送镜像正常,但通过Jenkins任务执行时失败,核心问题出在推送阶段的EOF错误,同时日志里还暴露了一个Docker tag命令的小问题,我们一步步来解决:
1. 先处理Docker tag的--force参数报错
日志里明显看到:
+ docker tag --force=true devteam/maven devteam/maven:84 unknown flag: --force
这是因为你的Jenkins从节点上的Docker版本比较旧(低于1.12版本),旧版本的docker tag命令根本不支持--force参数。虽然插件后续自动重试了不带--force的命令,但这个异常可能打乱了后续流程的稳定性。
解决方法:
- 优先升级Jenkins从节点的Docker版本到1.12+,让它支持
--force参数,从根源上避免这个问题; - 要是暂时没法升级Docker,就直接在Jenkinsfile里手动执行tag命令,替代插件的自动tag逻辑:
stage('Push image') { docker.withRegistry('https://docker.maven-qa.xxx.partners', 'docker-credentials') { // 手动执行tag,绕过插件自动加--force的坑 sh "docker tag devteam/maven devteam/maven:${env.BUILD_NUMBER}" sh "docker push devteam/maven:${env.BUILD_NUMBER}" } }
2. 核心问题:推送时的EOF错误
手动推送正常,但Jenkins任务里失败,说明问题出在Jenkins运行环境和你手动操作环境的差异上:
可能原因1:Jenkins运行用户的权限或Docker配置问题
日志里显示Jenkins是用tomcat6用户运行的(Wrote authentication to /usr/share/tomcat6/.docker/config.json),而你手动推送时大概率用的是root或者个人用户。
检查&修复步骤:
- 切换到tomcat6用户,执行
docker info,看是否能正常输出Docker daemon的信息——如果报错,说明该用户没权限访问Docker,执行usermod -aG docker tomcat6,然后重启Jenkins服务; - 对比
/usr/share/tomcat6/.docker/config.json和你手动推送用户的~/.docker/config.json,确保Artifactory的认证信息完全一致; - 检查tomcat6用户的家目录权限,确保
.docker文件夹和里面的配置文件是该用户可读写的。
可能原因2:网络代理或连接超时问题
虽然你设置了server.bypassProxy = true,但Jenkins的全局代理设置可能还是影响了Docker的推送请求,或者网络波动导致连接中断。
检查&修复步骤:
- 用tomcat6用户执行
curl -v https://docker.maven-qa.xxx.partners,确认能正常连接Artifactory的Docker仓库; - 调整Docker的推送超时和并发数,在推送前添加配置:
降低并发数、延长超时时间,避免因网络波动导致连接中断。sh "echo '{\"max-concurrent-uploads\": 1, \"timeout\": 300}' >> /usr/share/tomcat6/.docker/config.json"
可能原因3:Artifactory仓库的权限或路径问题
虽然手动推送正常,但Jenkins任务里的推送可能因为镜像标签或者仓库权限的细微差异导致失败。
检查&验证步骤:
- 直接用tomcat6用户模拟Jenkins的操作流程:
如果这步也失败,说明是tomcat6用户的环境或Artifactory权限问题;如果成功,那就是Jenkins插件的逻辑问题,直接用手动tag+推送的方式替代插件逻辑即可。su - tomcat6 docker login https://docker.maven-qa.xxx.partners -u <你的用户名> -p <你的密码> docker tag devteam/maven devteam/maven:84 docker push devteam/maven:84
总结
最快定位问题的方法是先模拟Jenkins的运行用户(tomcat6)手动执行推送流程,确认是环境问题还是Jenkins插件问题。如果是环境问题,优先排查权限和网络;如果是插件问题,就用手动命令替代插件的自动逻辑。
内容的提问来源于stack exchange,提问作者devops
相关产品推荐
相关产品推荐

