为什么在Docker快速入门terminal中“docker login”失败,但是在默认机器中工作?

我已经在Windows 8.1中安装了Docker Toolbox,并且一直在关注安装教程。 当到达创build和推动自己的形象的步骤时,我试图运行docker login ...时出现此错误docker login ...

 ### VIA Docker Quickstart Terminal ### docker login --username=myuser --password="mypass" --email=myemail@gmail.com time="2015-11-17T03:20:58.160803558Z" level=debug msg="Calling POST /v1.21/auth" time="2015-11-17T03:20:58.160838971Z" level=info msg="POST /v1.21/auth" time="2015-11-17T03:20:58.169033324Z" level=debug msg="hostDir: /etc/docker/certs.d/https:/registry-win-tp3.docker.io/v1" time="2015-11-17T03:20:58.169071565Z" level=debug msg="pinging registry endpoint https://registry-win-tp3.docker.io/v1/" time="2015-11-17T03:20:58.169084660Z" level=debug msg="attempting v1 ping for registry endpoint https://registry-win-tp3.docker.io/v1/" time="2015-11-17T03:20:58.898542338Z" level=debug msg="Error unmarshalling the _ping PingResult: invalid character '<' looking for beginning of value" time="2015-11-17T03:20:58.898803841Z" level=debug msg="PingResult.Version: \"\"" time="2015-11-17T03:20:58.898818084Z" level=debug msg="Registry standalone header: ''" time="2015-11-17T03:20:58.898836197Z" level=debug msg="PingResult.Standalone: true" time="2015-11-17T03:20:58.898853685Z" level=debug msg="attempting v1 login to registry endpoint https://registry-win-tp3.docker.io/v1/" time="2015-11-17T03:20:59.478756938Z" level=error msg="Handler for POST /v1.21/auth returned error: Unexpected status code [403] : <html><body><h1>403 Forbidden</h1>\nRequest forbidden by administrative rules.\n</body></html>\n\n" time="2015-11-17T03:20:59.478815334Z" level=error msg="HTTP Error" err="Unexpected status code [403] : <html><body><h1>403 Forbidden</h1>\nRequest forbidden by administrative rules.\n</body></html>\n\n" statusCode=500 

试图解决这个问题,我试图运行docker login ...从docker默认的虚拟机。 它在那里工作!

 ### VIA default virtual machine (192.168.99.100) ### docker login --username=myuser --password="mypass" --email=myemail@gmail.com https://index.docker.io/v1/ time="2015-11-17T03:20:46.053333255Z" level=debug msg="Calling POST /v1.21/auth" time="2015-11-17T03:20:46.053404176Z" level=info msg="POST /v1.21/auth" time="2015-11-17T03:20:46.082796012Z" level=debug msg="hostDir: /etc/docker/certs.d/https:/index.docker.io/v1" time="2015-11-17T03:20:46.082930763Z" level=debug msg="pinging registry endpoint https://index.docker.io/v1/" time="2015-11-17T03:20:46.082946790Z" level=debug msg="attempting v1 ping for registry endpoint https://index.docker.io/v1/" time="2015-11-17T03:20:46.082959103Z" level=debug msg="attempting v1 login to registry endpoint https://index.docker.io/v1/" 

我注意到他们正在使用两个不同的URL,第一个遇到parsing错误。 凭据显然是正确的,因为他们从VM内部工作,除非这两个域不共享用户。 url或响应是否被MINGW64破坏?

2016年2月更新

PR 19891“启用跨平台loginregistry”应该解决这个问题

为守护者login使用守护进程定义的registryURL。

这允许Windows客户机与Linux守护进程进行交互,以正确使用默认的registry端点而不是Windows特定的端点。

这是在提交19eaa71 (也许docker1.10?)


这报告在docker/docker问题15612和docker/docker问题18019

在对源代码进行了一些分析之后,我发现我们在Windows和UNIX上有不同的registryURL。

  • Windows: https : //registry-win-tp3.docker.io/v1/
  • Unix: https : //index.docker.io/v1/

Windowsurl来自最近的公关15417 ,评论:

 // Currently it is a TEMPORARY link that allows Microsoft to continue // development of Docker Engine for Windows. 

所以有可能这个url不起作用(除非你是在一个非常新的Windows Server 2016上)


docker/hub-feedback问题似乎有一个解决办法,其中包括:

  • 指定docker io的默认索引registry,

     docker login --username=myuser --password=mypassword --email=myemail https://index.docker.io/v1/ WARNING: login credentials saved in C:\Users\myuser\.docker\config.json Login Succeeded 
  • 修改上一步创build的config.json文件,以便为registry-win添加与index.docker.io相同的凭据:

config.json

 { "auths": { "https://index.docker.io/v1/": { "auth": "myhash", "email": "myemail" }, "https://registry-win-tp3.docker.io/v1/": { "auth": "myhash", "email": "mydomain" } } } 

之后, docker push index.docker.io/myuser/myrepo:latest确实工作。