Jenkins+Docker CI/CD流水线推送镜像失败,报错denied: requested access to the resource is denied
嘿,我之前碰到过几乎一模一样的问题!结合你提到的Docker引擎更新操作,还有之前构建日志里的警告信息,大概率是更新后Docker的认证机制或权限配置出了问题,给你几个亲测有效的排查和解决方向:
旧Docker认证配置被弃用:你上次成功的构建日志里已经明确提示
~/.dockercfg这个旧配置文件即将被弃用,更新Docker引擎后,新版本可能直接不再兼容这个格式,转而使用~/.docker/config.json。解决起来很简单:在Jenkins运行的机器上,用执行Jenkins命令的用户手动登录一次Docker仓库(执行docker login <你的仓库地址>),这会自动生成新的config.json配置文件。之后要确保Jenkins用户能读取这个文件,或者在Jenkins的凭证管理里重新配置Docker仓库的账号密码,关联到流水线的镜像推送步骤。镜像命名格式出错:Docker推送镜像必须符合
<仓库地址>/<用户名>/<镜像名>:<标签>的规范,更新引擎后如果流水线里的镜像命名不小心改了(比如漏写了仓库地址或用户名),就会触发权限拒绝报错。你可以对比之前成功的构建日志,确认现在docker build -t和docker push命令里的镜像名称和之前完全一致,比如之前是docker push myhub.com/myaccount/myapp:v1,现在可不能简化成docker push myapp:v1。Jenkins用户的Docker组权限丢失:Docker引擎更新可能重置了用户组权限,导致运行Jenkins的用户不在docker用户组里,没法正常执行镜像推送命令。你可以执行
usermod -aG docker jenkins(如果Jenkins用的是默认的jenkins用户),然后重启Jenkins服务和Docker服务,让权限设置生效。仓库账号权限变动:也有可能不是本地的问题,你可以手动用相同的账号在本地机器推送同一个镜像,如果手动操作也失败,那就是仓库那边的权限出了问题——比如管理员调整了仓库的推送权限,或者你的账号过期了,这时候就得去检查仓库的账号权限设置了。
备注:内容来源于stack exchange,提问作者Salahuddin Shayan

