解决Nexus Docker仓库搜索镜像返回500错误

之前用 Nexus 给团队搭建了一个数据仓库,其中 Docker 仓库配置教程已经整理分享到了博客《Nexus3 最佳实践系列:搭建 Docker 私有仓库》,但是一直有个小问题,使用 docker search 来搜索会返回 500 错误:

因为平常不怎么使用搜索,而且 Nexus 前台也有镜像浏览页面,所以一直没花时间去解决。年前封网好不容易有点空闲,寻思着解决下。

经过定位,发现了问题所在:Nexus 里面的 Docker 有 3 种类型仓库:group、hosted、proxy,也就是组合仓库、本地仓库和代理仓库,其中组合仓库就是本地仓库和代理仓库的聚合,通过测试发现只有本地仓库才支持 search 请求,其他 2 种类型仓库都会 500 错误。所以,报错的直接原因就是我将 search 的请求转发到了组合仓库导致的。

解决办法非常简单,在 nginx 转发里面加一条规则即可:

Ps:详见之前的文章:https://zhang.ge/5139.html 。

以下是定位过程,不感兴趣的可以忽略。。。

1、确认 Nginx 代理日志是正常打开状态,并 tail -f idocker.io.log 实时查看日志;

2、执行 docker search 发起搜索:

3、回过来查看日志:发现 500 错误的内容如下(我这边 Nginx 改成了 json 格式):

2 个重要的信息:搜索请求使用的是 GET 方法,请求路径是 /v1/search?q=hello-world&n=25。

4、直接对仓库后端一次发起请求,首先试了下 group 组合仓库,端口 8082:

终于看到了关键的报错:

大概意思是不支持 SEARCH,于是继续试了下 hosted 本地仓库,端口 8083:

很明显是可以的,然后再试了下 proxy 代理仓库,都不行。因此确定只有本地仓库是可以搜索的!

回头看了下 Nginx 代理的配置,发现我之前将所有 GET 都丢给了组合仓库,也就是转发了拉取请求,将 PUT 丢给了本地仓库,意思是转发了推送请求。看来,还需要多加一个规则,将搜索请求转发到本地仓库。

也就是得出了上文的规则:

这个规则明显要加到 PUT 转发规则之后,以覆盖之。

生效后,再次执行 docker search idocker.io/hello-world,结果如下:

问题得到解决~!

当然,还有点遗憾的是代理和组合仓库不支持搜索~希望后续 Nexus 版本能够考虑加上这个特性。

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:9   其中:访客  9   博主  0

  1. 励志语录 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省杭州市 联通

    咦,第一次沙发,好紧张,有没有潜规则 :grin:

  2. 创业路上 1 来自天朝的朋友 谷歌浏览器 Windows 10 江苏省常州市 电信

    不知道为什么,我的网站好像被百度鄙视了,权重一直是零,而且SEO数据一直不更新,郁闷啊

  3. 我爱技术网 1 来自天朝的朋友 谷歌浏览器 Windows 7 四川省成都市 电信

    跟着张戈大佬能学习到不少技术 :grin:

  4. i4t运维博客 0 来自天朝的朋友 火狐浏览器 Mac OS X 10.13 北京市 联通

    请问一下博客,把整个网站都改成docker容器,性能会不会好一点? 我服务器是1h2g的

  5. wordpress建站吧 2 来自天朝的朋友 谷歌浏览器 Windows 10 四川省成都市 电信

    技术很niu 啊

  6. 跨境电商之家 1 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省邵阳市 电信

    感谢分享!!!

  7. 金稻田 0 来自天朝的朋友 QQ浏览器 Windows 10 广东省深圳市南山区 电信

    很棒的教程 一直在找相关的内容 感谢分享

  8. 未来往事 0 未知系统 谷歌浏览器 Windows 10 北美地区

    很棒的教程 感谢分享

  9. 趣知识 3 来自天朝的朋友 火狐浏览器 Windows 7 北京市 联通

    张戈厉害啊,啥时搞了这么一名牛B的域名呀

加载中,请稍候...