Nexus Docker Registry - 匿名拉取失败

27

我正在使用Sonatype Nexus作为私有Docker注册表。

尽管对经过身份验证的用户有效,但尝试使用匿名用户来拉取镜像就会失败。这只会在Docker客户端上发生。

使用Nexus UI(未登录)可以浏览我的仓库中的图像。但是,尝试拉取镜像时,我会收到“未经授权”的错误。

以下是Docker客户端和Nexus仓库之间通信的捕获流:

Wireshark数据包捕获

这很奇怪,因为启用了匿名访问,并且根据文档,我可能有一个具有通过HTTPs端口进行RW访问的Docker托管注册表以及指向Docker托管注册表的Docker组注册表,可进行RO / Anonymous访问。

3个回答

22

这个功能是在Nexus 3.6中添加的。根据文档

  1. 在“安全性”>“领域”下,启用“Docker Bearer Token Realm”
  2. 在存储库配置中取消选中“强制基本身份验证”

3
对于3.16.2版本,第一步已足够,且在仓库配置中不再有“强制基本身份验证”的复选框。 - dormi330
2
对于3.17.0版本,我必须用以下步骤替换第2步: 2. 在主管理导航菜单下的“安全”>“匿名”中: 勾选“允许匿名用户访问服务器”, 用户名=anonymous, 并将领域更改为“Docker Bearer Token Realm”。 - CrazyPyro
以上链接已经失效。新链接:https://help.sonatype.com/repomanager3/formats/docker-registry/docker-authentication - patrickuhlmlann
更新的信息: https://github.com/moby/moby/issues/30880#issuecomment-763273957 - Blackclaws

9
Nexus给我带来了很多麻烦,直到我找到一个相当晦涩的sonatype post,指出不要更改匿名领域。
所以我遵循以下步骤使其正常工作:(在Nexus 3.19.1至3.38.1中测试通过)
  1. 与@andrewdotn的回答相同(在“安全性>领域”部分启用Docker Bearer Token领域)

  2. 本地授权领域启用匿名访问(如上述链接所述)

  3. 创建docker(代理)存储库(在此示例中代理hub.docker.com

3.1. 启用HTTP/HTTPS端点(根据您是否使用SSL到nexus或使用反向代理而定)

3.2. 启用"允许匿名Docker拉取(需要Docker Bearer Token Realm)"

3.3. 将"https://registry-1.docker.io"输入为"远程存储库的位置"(适用于docker-hub

3.4. 设置"Docker Index"以使用Docker Hub Index(也称为"使用Docker Hub"

3.5. 保存

  1. 确保您的匿名用户有权读取新存储库(默认anon-role将允许读取更多内容,但应已允许anon pull)

4.1.(可选的)如果您希望尽可能限制匿名用户(即:仅允许docker pull),则创建一个角色"nx-docker_read"(或类似角色),并将其赋予"nx-repository-view-docker--read" *。(这将允许组中的任何用户从允许anon pull的任何docker存储库中拉取图像,但不能在Web UI上看到任何内容)

4.2.(如果您完成了4.1)现在只需更改anon用户的组为您的新角色(在我的示例中为"nx-docker_read"),并将其从"nx-anonymous"中删除 => anon用户无法再在Web UI上浏览nexus,但仍然可以拉取图像。


“docker index”和“远程仓库的位置”应该在docker(代理)中配置吗?我认为这是不正确的。 - gavioto
好的,因为Docker(代理)应该代理外部注册表,是的(UI会强制你这样做,据我所知)。有一个单独的Docker(托管)仓库,在那里你不需要它。 - h1dden.da3m0n
1
这解决了我的问题。我已更改匿名用户的领域,导致无法访问匿名用户。我无法通过更改设置来修复它。我必须清除nexus安装并按照这些步骤重新开始,最终获得了能够接受匿名pull的代理服务器。 - Brady
首先,感谢您更新我的评论,很高兴我能做出有用的贡献 xD 其次,说实话@Brady最初也遇到了同样的问题,这促使我写下这篇文章,所以很高兴我不是一个人。 - h1dden.da3m0n

3
Docker Registry API需要进行身份验证才能访问仓库,即使是拉取操作,Nexus 3也是如此。Dockerhub始终需要访问令牌,即使是用于拉取操作。但是,你可以匿名从dockerhub中拉取的原因是它使用了一个令牌服务器,该服务器会自动向匿名用户提供访问令牌。目前在Nexus 3.0.1中,这种机制不可用。也许它将被实现(https://issues.sonatype.org/browse/NEXUS-10813)。因此,在Nexus 3中,当前需登录后方可拉取镜像(如果你的权限设置为这种方式,则允许使用匿名用户)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接