一、 使用mvn compile jib:build 提示依赖镜像拉取失败
这个比较奇怪,我的harbor是部署在https上的,https端口是443,经过测试https是可以正常访问的,但是这里为啥要通过http来进行访问比较让人费解,而且3030是内部端口,我并没有在配置文件中定义,它为何要访问这个端口?
解决方法: 具体原因先不讨论,这里首先是将防火墙的3030端口开放,同时开放允许http访问
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>${jib.maven.plugin.version}</version>
<configuration>
<!--允许非https-->
<allowInsecureRegistries>true</allowInsecureRegistries>
</configuration>
</plugin>
二、经过上一步处理后,重新打包,又出现新的问题
Unauthorized for harbor.xxxx: 401 Unauthorized
这是推送镜像包到harbor的过程中出现的异常,经过多次检查验证,配置的用户名和密码都是正确的,没有任何问题
<to>
<image>${docker.harbor.addr}/${project.artifactId}</image>
<auth>
<username>${docker.harbor.username}</username>
<password>${docker.harbor.password}</password>
</auth>
</to>
解决方案: 使用如下指令进行打包:
mvn compile jib:build -DsendCredentialsOverHttp=true
三、问题反思
经过以上几步,问题算是解决了,镜像也已经成功推送,但是其背后的问题依旧让人困惑,我的harbor明明是部署在https上的,为啥非要使用http访问,难道是这个maven插件的问题吗?
既然问题想不通,那么就直接看源码吧,经过一番周折,总算是把jib-maven-plugin项目的源码拉下来了
大概流程就是,jib-maven-plugin不会主动进行登录,而是在请求失败返回401错误码后再去进行登录,而且它登录的路径和地址不是固定的,而且从harbor返回结果中的返回头 Www-Authenticate 中获取,而返回头的内容大概如下:
Bearer realm="http://<host>:3030/service/token",service="harbor-registry",scope="repository:test:pull,push repository:amazoncorretto\n:pull"
这个realm 就是登录的接口
四、解决方案
1、如果是原生部署方式,直接在 harbor.yml 添加或启用如下配置并重启
external_url: https://<domain>
2、如果是使用docker进行的部署,那么同样需要配置 external_url
首先是core容器中的 env 文件配置:
EXT_ENDPOINT=https://<domain>
然后是registry容器中的config.yml 配置:
auth:
token:
issuer: harbor-token-issuer
realm: https://<domain>/service/token
最后重启所有容器即可