拒绝:将图像推送到 gitlab 注册表时,请求访问资源被拒绝

问题描述 投票:0回答:6

我正在尝试将图像推送到 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_repository
read_registry
权利。

我的仓库是:

https://gitlab.com/mycompany/rgpd_api

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

但是当我通过 Gitlab CI 执行此操作时,使用

gitlab-ci-token

我可以正常推。

我也尝试重新生成一个新的令牌,但仍然是同样的问题。

我该如何修复它?

docker gitlab registry gitlab-ci
6个回答
22
投票

我也偶然发现了这个问题,事实证明

  • 组级部署令牌可用于将映像推送到组级容器注册表,类似于具有 API 访问权限或其他适用范围的 PAT 令牌。
  • 图像必须使用与组内现有项目匹配的标签进行标记。
  • 任何带有不同标记的图像都将被拒绝,并显示
    denied: requested access to the resource is denied
    错误消息。

因此,进行以下设置:

  • GitLab 小组名为
    mytest
  • 该小组内的项目称为
    hello-world
  • Docker 镜像标记为
    registry.gitlab.com/mytest/hello-world
  • 部署为整个组创建的令牌
  • Docker 守护进程被授权推送到该注册表
    cat "<deploy_token>" | docker login -u "<token_username>" --password-stdin registry.gitlab.com

您将得到以下结果:

  • 成功推送
    docker push registry.gitlab.com/mytest/hello-world
    ,因为组内有这样的项目
  • denied: requested access to the resource is denied
    如果您尝试推送带有组中不存在的项目名称标记的图像,例如
    docker push registry.gitlab.com/mytest/no-project

因此,必须再次标记图像以匹配组内的现有路径,例如组或子组内的现有项目。


1
投票

我的错误是使用部署令牌将映像推送到注册表。

部署令牌可用于拉取映像,但不能推送映像。

因此,您可以生成个人访问令牌。您至少应该添加权限:

read_registry, write_registry

1
投票

确保您在设置中进行了正确的配置。

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

这发生在我身上,我就是这样解决的。


1
投票

您可以制作

docker logout your registry
并重新登录。 它正在重新创建您的令牌。 这对我来说有效。


0
投票

令牌权限需要

write_registry
read_registry
。 尽管 write_package_registry 的文档说“允许对包注册表进行读、写和删除访问。”...


0
投票

只是根据我最近的经验提出解决方案:

如果您使用

sudo docker push
,它可能/很可能没有使用您保存的凭据,而是尝试使用计算机上不存在的
root
用户凭据进行身份验证。

尝试使用

docker push
进行推送,看看是否成功。

© www.soinside.com 2019 - 2024. All rights reserved.