尝试推送到我的私有存储库时,我不断收到 404 错误。为什么?

I keep getting a 404 error when trying to push to my private repository. Why?

我完全按照 docker 文档中的说明创建了一个注册表,出于某种原因,每当我尝试将图像推送到它时,它都会向我抛出 404 错误。

这里是错误 Error: Status 404 trying to push repository stelasite: "404 page not found\n"

在服务器端,这 11/8/2015 6:33:00 PM173.12.71.226 - - [08/Nov/2015:23:33:00 +0000] "GET /v2/ HTTP/1.1" 401 87 "" "docker/1.8.2-fc22 go/go1.5.1 kernel/4.2.3-200.fc22.x86_64 os/linux arch/amd64" 11/8/2015 6:33:05 PM173.12.71.226 - - [08/Nov/2015:23:33:05 +0000] "PUT /v1/repositories/stelasite/ HTTP/1.1" 404 19 "" "docker/1.8.2-fc22 go/go1.5.1 kernel/4.2.3-200.fc22.x86_64 os/linux arch/amd64"

有谁知道发生了什么事吗?显然它无法连接到 v1 api 但我不知道为什么 docker cli 甚至会尝试这样做。

当注册表机器响应非常慢时,我遇到了同样的错误。就我而言,这是其中一台 dns 服务器的问题。

更改 DNS 服务器,使推送再次工作。您可以通过 ping 分发服务器来测试它,看看响应或解析主机名是否很慢。

如果您 运行 docker 使用 --debug,这是日志的输出:

DEBU[0013] Calling POST /images/{name:.*}/push
INFO[0013] POST /v1.20/images/docker-distribution.company.net:5000/nginx/push?tag=
DEBU[0023] hostDir: /etc/docker/certs.d/docker-distribution.company.net:5000
DEBU[0033] Trying to push docker-distribution.company.net:5000/nginx to https://docker-distribution.company.net:5000 v2
DEBU[0038] Error getting v2 registry: Get https://docker-distribution.company.net:5000/v2/: net/http: request canceled while waiting for connection
DEBU[0038] Trying to push docker-distribution.company.net:5000/nginx to https://docker-distribution.company.net:5000 v1
DEBU[0038] hostDir: /etc/docker/certs.d/docker-distribution.company.net:5000
DEBU[0038] attempting v2 ping for registry endpoint https://docker-distribution.company.net:5000/v2/
DEBU[0043] Endpoint https://docker-distribution.company.net:5000/v2/ is eligible for private registry. Enabling decorator.

可以看到错误是"request canceled while waiting for connection".

我遇到了同样的问题,并通过整理我的本地 docker 环境解决了这个问题。

问题的原因要么是我的 Docker 客户端太旧,要么是我的 Docker 客户端 (1.7.1) 之间的 docker 版本不匹配和 docker-机器虚拟机 (1.8.1)。我的版本不匹配,因为我创建了 VM,然后降级了我的 docker 客户端。注册表上的访问日志显示客户端是 1.8.1,即使我的主机系统是 1.7.1。我删除了 docker-machine VM (docker-machine rm <environment name>),然后卸载了 docker 并通过 Homebrew 重新安装了 1.10.0。

如果负载均衡器后面有 运行 多个 Docker 注册表,则可能导致推送问题的另一件事是 HTTP 机密不匹配。您需要使用环境变量 REGISTRY_HTTP_SECRET 或在配置文件中像这样将它们显式设置为相同的东西:

http:
    secret: mysecret

我看到一篇 2013 年的博客 post 声称秘密需要 64 个字符长,但我在文档中没有看到这一点