通过 VPN 工作时如何解决“EOF”Docker pull 错误?

通过 VPN 工作时如何解决“EOF”Docker pull 错误?

我从公共 Docker 注册表中提取映像并收到以下错误:

% docker pull ubuntu
Using default tag: latest
Error response from daemon: Head "https://registry-1.docker.io/v2/library/ubuntu/manifests/latest": Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull&service=registry.docker.io": EOF

这发生在我的工作笔记本电脑上,其中所有流量都通过始终开启的 VPN 路由。我可以暂时禁用它,但目标是让它正常工作已连接公司 VPN。如果我禁用 VPN,则docker pull一切正常。

此外,我公司还有一种解密 TLS 流量的做法,即通过在用户机器上安装公司的 CA 证书来实现,该证书作为解密流量的新根。TLS 解密仅在通过 VPN 工作时发生。

很明显,VPN 会干扰docker pull,但我正在尝试弄清楚具体如何向网络团队请求修复。请帮我了解问题是否源于 TLS 解密实践,还是其他与网络相关的问题。

首先,Docker Desktop for Mac 的文档

支持所有受信任的 CA(根 CA 或中间 CA)。Docker Desktop 根据 Mac Keychain 创建所有用户信任的 CA 的证书包,并将其附加到 Moby 受信任的证书中。因此,如果主机上的用户信任企业 SSL 证书,Docker Desktop 也会信任该证书。

基于此,TLS 解密应该不是问题,因为正确的根 CA 证书已经在 Mac 的 Keychain 中。但是,由于 TLS 解密会导致许多其他问题,因此我仍然怀疑它。

其次,这可能是纯粹的网络问题。其中一个问题是已报告对于 Docker for Mac,错误消息完全相同,所有评论者都同意 OP 遇到了网络问题。为了排除这个问题,我尝试手动下载镜像:

token=$(curl -s 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull' | jq -r .token)
man_digest=$(curl -s 'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' -H "Authorization: Bearer $token" | jq '.manifests[] | select(.platform.architecture=="amd64")' | jq -r .digest)
blob_digest=$(curl -s "https://registry-1.docker.io/v2/library/ubuntu/manifests/$man_digest" -H "Authorization: Bearer $token" -H "Accept: application/vnd.oci.image.manifest.v1+json" | jq -r '.layers[0].digest')
curl -sL "https://registry-1.docker.io/v2/library/ubuntu/blobs/$blob_digest" -H "Authorization: Bearer $token" > layer0.blob

启用 VPN 后,成功了。因此,看起来提取映像所需的所有机制都有效,并且注册表可以访问。这让我重新怀疑证书验证,但此时我不知道如何继续。文档清楚地表明 Docker Desktop 应该使用 OS 证书存储;我确信此证书在存储中,因为我使用了完全相同的证书来修复其他工具(pip、poetry、curl 等)中的 SSL 验证。

也有可能问题不是出在这两者之一,而是出在其他方面。请建议下一步的故障排除步骤。

相关内容