我已经为 Docker Hub 注册表设置了 AWS ECR 拉取缓存。
假设它在以下情况下可用:123.dkr.ecr.eu-central-1.amazonaws.com/docker
。
现在使用以下方式进行身份验证后:
aws ecr get-login-password ... | docker login 123.dkr.ecr.eu-central-1.amazonaws.com -u AWS --password-stdin
我可以做类似的事情docker pull 123.dkr.ecr.eu-central-1.amazonaws.com/docker/library/busybox:latest
。
这一切都是有道理的,但我的问题是,这在底层是如何工作的,因为如果我使用以下命令发出 HTTP 请求:
curl -vv -H "Authorization: Basic $(echo -n AWS:$(aws ecr get-login-password ...) | base64 -w 8000)" -v https://123.dkr.ecr.eu-central-1.amazonaws.com/v2/docker/library/busybox/manifests/latest
我明白了
{"errors":[{"code":"MANIFEST_UNKNOWN","message":"Requested image not found"}]}
或者更准确地说,第一次出现错误,但调用后docker pull
(我可以看到图像已缓存在 ECR 上)它开始工作。
我读了https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md还是不明白。官方 docker 客户端做了什么,与我的 HTTP 请求有什么不同,它强制 ECR 实际拉取图像并开始缓存它?它与 docker 身份验证有关吗 - 但如何发出信号来docker
表明它稍后将请求什么标签?
因为缓存后,正常协议似乎可以工作(我实际上并没有下载所有 blob,但至少清单返回了正确的响应 - HTTP 200 layers
)。但正如所提到的,第一次请求相同的 URL 会返回 HTTP 404。我也尝试等待了一会儿 - 没有运气,我的请求似乎从未启动 ECR 下载图像的过程,尽管尝试添加 User-Agent 标头、将 HTTP 请求更改为 HEAD 等等。