拒绝访问:请求访问资源被拒绝:docker。

805

我正在遵循此链接创建我的第一个Docker镜像,它成功了,现在我正在尝试从此链接将此镜像推送到我的Docker仓库。但是每当我尝试将此镜像推送到仓库时,就会出现这种类型的错误。

denied: requested access to the resource is denied

注意:我已成功登录 Docker。


1
确保您不会犯这个错误:https://dev59.com/niX-s4cB2Jgan1znszAf#59626146 - Jithin Pavithran
4
请务必确认您的电子邮件。如果您在想谁会做这样愚蠢的事情,那么我在推送之前没有确认我的电子邮件。 - Luv33preet
6
这个对我有用。 https://dev59.com/mFoV5IYBdhLWcg3wIbxT#42300879 - abitcode
检查是否需要使用 sudo - Sisir
69个回答

16

我的问题非常简单,就是在我的图像名称中使用了无效字符(多余的 /):

myusername/something/image

是无效的图片名称。尝试使用 myusername/something-image。希望这能帮助到某人。


2
这是一个糟糕、不具体的错误信息!我也遇到了同样的问题。而且,它不允许重复的特殊字符,例如**__**。 - ijoseph
1
哦唷。知道那会引起麻烦,但还是试图解决了。错误其实是一个非常具有误导性的错误信息。 - bwl1289

14

Docker 对于私有仓库的数量也有限制。如果你通过本地机器推送来创建一个私有仓库,它会创建该仓库,但是不能再向其推送或从中拉取任何内容,此时你会收到“请求访问资源被拒绝”的错误信息。


如何始终将其作为公共存储库推送? - Raja Anbazhagan
我也遇到了这个问题:推送新的仓库时出现“21/20个私有仓库”的错误。最后一个仓库进入了某种被阻止的状态:即使减少了私有仓库的总数,我仍然收到访问被拒绝的错误。我不得不删除并重新创建该仓库。 - lenz

13

操作系统: Ubuntu16.04

原因: 我删除了客户端配置文件 (~/.docker/config.json)

解决方案:

  • 重启 docker 服务。
    service docker restart.
  • 需要输入登录信息,然后会自动生成配置文件。
    docker login --username=yourdockerhubername --email=youremail@company.com

1
这是唯一对我有效的解决方案。我升级了我的Docker,然后由于某种原因,mvn dockerfile:push失败并出现了异常。删除此config.json文件解决了问题。 - anand1st
这也帮助了我。我意识到要登录,我不应该放置URL,或者如果我需要指定Docker Hub URL,我应该放置docker login https://index.docker.io/v1/ -u=yourusername - Ronan Quillevere

13

是的,也许有些尴尬,但这个问题似乎没有清晰的说明文档:我刚刚注册了带有私有存储库的Docker Pro。我创建了一个私有存储库,然后尝试将其推送。结果得到了可怕的“拒绝”消息。

推送到我的公共存储库很顺利,所以我知道我已经正确登录。

在尝试了与Docker Hub相关的前30个答案之后...我终于明白了私有存储库的工作原理:它们与公共存储库相同,但多了一步。


当推送到Docker Hub帐户中的任何存储库时 - 您需要在image:tag之前添加用户名前缀,例如:

假设以下值:

用户名=yourusername
映像名称=theimage
标签=thetag

1) 对本地映像进行标记(或提交),添加您的用户名前缀

docker tag theimage:thetag yourusername/theimage:thetag

注意:

  • 如果您在一个组织中,您需要进行双重前缀图像 - 就像这样:

docker tag theimage:thetag yourusername/yourorganizationname/theimage:thetag
  • 如果您的标签是latest,可以省略:thetag部分;如果您没有输入:thetag部分,Docker会假定您使用了:latest

2) 将带有前缀的镜像推送到Docker Hub:

 docker push yourusername/theimage:thetag

或者

 docker push yourusername/yourorganizationname/theimage:thetag

额外步骤:

要么

在上述第1步之前,在您的Docker Hub帐户中创建一个私有存储库。

请注意,存储库名称必须与您计划推送的theimage相同。不要在存储库名称上包含thetag部分。例如,如果您的镜像是ubuntu:14.04,则应将存储库命名为ubuntu

或者

如果您没有提前创建存储库(这不是必需的!):转到您在Docker Hub上的帐户;单击新推送的repo,然后单击其“设置”选项卡 - 并使您的repo变成私有。


我曾看到其他人使用两个前缀来标记它们的私有repos,例如xyz/abc/theimage:thetag,我还以为第二个前缀是我创建的,用于将repo标记为私有。不是这样的- 这仅适用于组织。去掉任何第2前缀并将我的repo名称设置为theimage即可解决我的被拒绝错误!

另一个注意事项:每个repo都包含具有给定repo名称的图像的所有标记版本。因此,例如,ubuntu:latestubuntu:14.04同时位于ubuntu repo中。

玩转Docker!


这个命令对我来说有效:docker tag theimage:thetag yourusername/theimage:thetag - JavierAgueroCL

13

关于docker如何处理用户ID和仓库名,可能会有些令人困惑。假设你在docker hub上创建了一个用户账户xyz,那么这个新账户会自动建立一个名称空间xyz,然后你再创建一个名为myrepo的仓库,那么该仓库的名字实际上是xyz/myrepo

要推送镜像,应该执行以下操作:

docker push docker.io/xyz/myrepo
您可以添加":latest"或其他标签(tag),如果需要的话。
如果您收到“请求访问资源被拒绝”的错误消息:
1. 前往https://hub.docker.com/并登陆为xyz。 2. 单击您的存储库xyz/myrepo。 3. 单击 Collaborators。 4. 将xyz添加为协作者。

这就意味着我们不能从第三方公共仓库推送镜像吗? - sdinesh94

10

将图片名称更改为“用户名” / “图片名称”


1
是的,它对我有效。需要在本地图像名称中指定我们的用户名,因为这不是git。 - Dendi Handian

7
有时您可能会遇到这个问题,当您已经用另一个帐户登录时。在这种情况下,您需要执行以下操作:
docker logout

然后

docker login  

这似乎是我遇到的问题。基本上,我使用凭据管理器从另一台机器导入了凭据,但似乎它没有起作用。 - hellowahab

7
我的回答与Azure DevOps类似的问题有关,我曾遇到以下常见的流水线问题(它更具体,但可能会帮助某些人节省时间):
  1. 从Github获取源代码
  2. 构建Docker镜像
  3. 将Docker镜像推送到DockerHub
在推送时,我收到的错误是 denied: requested access to the resource is denied,因此我来到这里。
请注意您的映像名称中包含的变量$(Build.Repository.Name)。默认情况下,它是来自Github的存储库名称,但为了使您的推送正常工作,应该是dockerhub_account_username/your_dockerhub_repository_name
在构建和推送步骤的映像名称字段中,将$(Build.Repository.Name)替换为dockerhub_account_username/your_dockerhub_repository_name
DockerHub API需要知道将镜像推送到何处。

7

如果您在使用Azure容器注册表时遇到此问题,可以先登录到您的注册表来解决它。

docker login yourregistry.azurecr.io

然后将你的镜像标记与你的注册表主机名匹配。

docker image tag yourimagename:[version] yourregistry.azurecr.io/yourimagename:[version]

最后,将其推送。

docker push yourregistry.azurecr.io/yourimagename:[version]

1
来自 Azure 的经验分享:这个问题的解决不在于命名空间,而是镜像仓库的主机名是标签的第一部分! - binaryguy
1
这对我来说真是救命稻草。非常感谢!我不知道为什么Azure快速入门步骤中没有包括这个。 - Alan Cabrera

6

对于那些试图将镜像推送到自己的Nexus仓库管理器的人,请按照以下步骤进行操作:

1)登录您的Nexus仓库管理器(端口8443与特定的Docker主机仓库相关联)。

sudo docker login xxx.mydomain.com:8443

2) 使用你的Nexus服务器IP/DNS标记这个映像

sudo docker tag myimage:latest xxx.mydomain.com:8443/myimage:1.0.0

3) 推送镜像

sudo docker push xxx.mydomain.com:8443/myimage:1.0.0

我在Jenkins Docker插件中遇到了一个问题,它总是引用docker.io。像xxx.mydomain.com:8443/myimage:1.0.0这样打标签解决了这个问题。请确保省略协议和/v2/内容。 - Himmet Avsar
为什么要添加端口?在 xxx.mydomain.com 附近添加哪个端口?8443 是用于 HTTPS Spring Boot 的。如果是 Angular 应用程序会怎样? - Satish Patro
1
当您的代码库解析到特定的http/https端口时,标签将需要知道要推送到哪里(因为您实际上没有告诉它去哪里-作为参数),如上所述,它需要是与您完整的nexus存储库相同的精确网址。 - Phil

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