jib-maven-plugin拉取adoptopenjdk镜像报I/O错误及SSL握手异常问询
问题解答
疑问1:已指定基础镜像认证参数,jib为什么还读取本地.docker/config.json
jib插件对基础镜像拉取和目标镜像推送使用两套独立的认证逻辑,二者互不干扰:
- 日志中读取
~/.docker/config.json的行为是针对你要推送的目标镜像registry.gitlab.com/myapp,你没有为目标镜像单独配置jib.to.auth相关参数,jib会按默认优先级从本地Docker配置、系统环境变量等位置搜索可用凭证,这和你传入的基础镜像认证参数无关。 - 从后续日志
Using credentials from <from><auth> for adoptopenjdk:11-jre-hotspot可以确认,基础镜像确实使用了你通过命令行传入的认证参数,没有读取Docker配置文件。
疑问2:凭证正确为什么抛出SSLHandshakeException错误
SSLHandshakeException是SSL传输层握手阶段的错误,发生在凭证校验之前,和你传入的凭证本身是否正确没有关系,你遇到这个问题的核心原因是认证参数配置对象完全错误:
- 你的基础镜像
adoptopenjdk:11-jre-hotspot存放在Docker Hub公开镜像仓库,你不需要为公开镜像配置拉取认证,而且你传入的jib.from.auth参数是GitLab的账号和Token,相当于用GitLab的凭证去访问Docker Hub的服务,触发了Docker Hub的安全拦截规则,直接断开了SSL连接。 - 你需要推送镜像到GitLab Registry,应该将GitLab的凭证配置到
jib.to.auth.username和jib.to.auth.password参数上,而非jib.from.auth相关参数。
除此之外还有几个可能的诱因,你可以逐一排查: - Jenkins节点配置了内网SSL代理,代理的自签名证书没有导入JVM信任证书库,导致JVM校验证书失败断开连接
- 内网防火墙或出口策略限制了Jenkins节点对Docker Hub 443端口的访问,连接被主动切断
- Jenkins节点使用的JDK版本过旧,默认支持的TLS版本低于Docker Hub要求的最低TLS 1.2版本,被远端拒绝连接
修复方案
删除命令行中的-Djib.from.auth.username=myUserName -Djib.from.auth.password=mygitlabtoken01参数,替换为-Djib.to.auth.username=myUserName -Djib.to.auth.password=mygitlabtoken01即可。
内容的提问来源于stack exchange,提问作者Jose A. Matarán
相关产品推荐
相关产品推荐

