记一次使用jib-maven-plugin进行docker打包并推送harbor中遇到的问题

979 阅读2分钟

一、 使用mvn compile jib:build 提示依赖镜像拉取失败

image.png

这个比较奇怪,我的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项目的源码拉下来了

image.png

image.png

image.png

image.png

image.png

大概流程就是,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

最后重启所有容器即可