私有注册表上代理后面的 docker 登录会导致 TLS 握手超时

yoh*_*eau 7 proxy docker

我们有一个私有的 docker 注册表在工作(基于 portus,但无论如何),我尝试将映像推送到此注册表,但它不起作用。它失败并显示以下错误消息:

$ sudo docker login archive.docker-registry.mycompany.com
Username: mylogin
Password: 
Error response from daemon: Get https://archive.docker-registry.mycompany.com/v1/users/:
    net/http: TLS handshake timeout
$ 
Run Code Online (Sandbox Code Playgroud)

我已经在 /etc/systemd/system/docker.service.d/http-proxy.conf 中配置了代理(我的 docker 在 centos 7 上):

[Service]
Environment="HTTP_PROXY=http://proxy.mycompany.com:8000/" "NO_PROXY=localhost,127.0.0.1,archive.docker-registry.mycompany.com"
Run Code Online (Sandbox Code Playgroud)

但它仍然失败。

我尝试在 url 中使用 http 或 https 使用 HTTPS_PROXY 而不是 HTTP_PROXY,我尝试手动下载证书并在系统中配置它们 (update-ca-certs) 但它一直失败。

当我更改此配置文件时,以 root 身份执行:

# systemctl daemon-reload
# systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

yoh*_*eau 8

实际上,我发现如果我注释掉完整的 Environment 行,它适用于私有注册表,但不再适用于 docker hub(当然,不再有代理)。这是适用于私有注册表和 docker hub 公共注册表的最终解决方案:

在 NO_PROXY 环境变量中,只应使用域名,而不是 FQDN(包括“archive.”主机名前缀):

这是我现在的配置文件:

[Service]
Environment="HTTP_PROXY=http://proxy.mycompany.com:8000/" "NO_PROXY=localhost,127.0.0.1,docker-registry.mycompany.com"
Run Code Online (Sandbox Code Playgroud)

请注意,没有更多的“存档”。也不是“portus”。NO_PROXY 中的前缀,只是从“docker-registry”开始的域名。

正如我看到的 docker 登录命令行,包括“存档”。前缀,这是误导,我认为它必须在 NO_PROXY 环境变量中......但不,它不应该。

希望它可以帮助某人。我希望我之前在谷歌上找到了答案,但我没有,所以我只是在这里发布它,它可能会对某人有所帮助。