被拒绝:在将镜像推送到GitLab仓库时请求访问资源被拒绝。

14

我想将一个镜像推送到GitLab注册表。

我已经做过很多次,所以我想知道为什么会出现这个错误。

我使用最新标签构建了该镜像:

Successfully tagged registry.gitlab.com/mycompany/rgpd_api:latest

然后我登录并推送:

docker login registry.gitlab.com -u gitlab+deploy-token-91931 
docker push registry.gitlab.com/mycompany/rgpd_api:latest

但我得到:

The push refers to repository [registry.gitlab.com/mycompany/rgpd_api]
be679cc302b9: Preparing 
denied: requested access to the resource is denied

我给了 gitlab+deploy-token-91931 这个令牌 read_repositoryread_registry 两种权限。

我的仓库是:

https://gitlab.com/mycompany/rgpd_api

我查看了文档页面:https://docs.gitlab.com/ee/user/project/container_registry.html

但是当我使用gitlab-ci-token通过Gitlab CI进行操作时,我可以正常推送。

我还尝试重新生成新的token,但仍然存在同样的问题。

我该如何解决?


我认为Docker登录不正确,你可以从“Packages > Container Registry”获取正确的URL。 - LinPy
为了让 -u 起作用,你需要 -p。 - LinPy
是的,我检查了URL,没问题。 - Juliatzin
此外,如果您没有加上 -p 参数,程序将会交互地要求输入密码。 - Juliatzin
你解决了吗? - Ali Okan Yüksel
是的,午餐时间过后我会发布答案 :) - Juliatzin
6个回答

25
我也遇到了这个问题,结果发现:
  • 组级别的Deploy token可以用于像具有API访问权限或其他适用范围的PAT token一样将镜像推送到组级别的容器注册表。
  • 镜像必须使用与组内现有项目匹配的标记进行标记。
  • 任何标记不同的镜像都将被拒绝,并显示denied: requested access to the resource is denied错误消息。
因此,根据以下设置:
  • 名为mytest的GitLab组
  • 该组中的名为hello-world的项目
  • 标记为registry.gitlab.com/mytest/hello-world的Docker镜像
  • 仅为整个组创建的Deploy token
  • 通过cat "<deploy_token>" | docker login -u "<token_username>" --password-stdin registry.gitlab.com授权Docker守护程序向该注册表推送
您将获得以下结果:
  • docker push registry.gitlab.com/mytest/hello-world的成功推送,因为在该组中存在这样的项目。
  • 如果您尝试推送标记为不存在于组中的项目名称的镜像,例如docker push registry.gitlab.com/mytest/no-project,则显示denied: requested access to the resource is denied
因此,请记住,镜像必须标记为与组内现有路径匹配的标记,例如组内现有项目或子组。

1
谢谢,你救了我的一天。当我创建一个名为“资源被拒绝”的新标签时,问题得以解决。 - Necip Sunmaz
1
非常好,非常感谢。 - Martin Frank
这个有没有记录在哪里?我还发现标签后缀(冒号后面的部分)也必须与项目中的一个分支匹配。所以,-t <项目名称>:<项目分支> 似乎是唯一允许的选项。 - Nathan Fig
这是一个文档链接:https://docs.gitlab.com/ee/user/packages/container_registry/index.html#naming-convention-for-your-container-images。它提供的路径示例是最简单的路径,如果你愿意,你可以更具体一些。<注册服务器>/<命名空间>/<项目>[/<可选路径>] - undefined

1

请确保您在设置中进行了适当的配置。

进入项目的“设置”,然后选择“可见性、项目功能、权限”,并勾选“容器注册表: 每个项目都可以拥有自己的空间来存储其Docker镜像”(仅限成员或所有人,由您决定)。否则,推送和拉取将被拒绝。

这也曾经发生在我身上,而这就是我解决这个问题的方法。


1

你可以使用docker logout 您的注册表并重新登录。 这将重新创建您的令牌。 在我的情况下有效。


1
我的错误是使用部署令牌将镜像推送到注册表中。
部署令牌可以用于拉取镜像,但不能用于推送。
因此,您需要生成一个个人访问令牌。您应该至少添加以下权限:
read_registry, write_registry

3
这个有引用来源吗?我也遇到了同样的问题,如果你说的是真的,那这可真是一个大问题,因为你可以在群组的 deploy token 中添加 write_registry 范围。 - Satrapes
1
这不是正确的。请参阅https://docs.gitlab.com/ee/user/packages/container_registry/authenticate_with_container_registry.html。 - laconbass
那不正确。部署令牌可以很好地推送图片。 - undefined
创建一个具有write_registry权限的部署令牌时,每次都会导致docker push失败。但是,如果创建一个具有read_registrywrite_registry权限的部署令牌,它就可以正常工作?请参考此链接(来自上面的评论:https://docs.gitlab.com/ee/user/packages/container_registry/authenticate_with_container_registry.html),其中写道:```所有这些身份验证方法都需要最低权限范围:对于读取(pull)访问权限,需要read_registry。 对于写入(push)访问权限,需要write_registry和read_registry。``` - undefined

0
只是根据我的最近经验提供一个解决方案:
如果你使用的是 "sudo docker push",很可能它没有使用你保存的凭据,而是尝试使用你机器上不存在的 "root" 用户凭据进行身份验证。
尝试使用 "docker push" 而不是 "sudo docker push" 进行推送,看看是否成功。

0
令牌权限要求同时具备write_registryread_registry两个权限。 尽管write_package_registry的文档中写着“允许对软件包注册表进行读取、写入和删除访问权限”...

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