
我已經為 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 用戶端所做的與我的強制 ECR 實際拉取映像並開始快取的 HTTP 請求不同的是什麼?它與 docker 身份驗證有關 - 但如何docker
指示稍後將請求什麼標籤?
因為在快取後,正常協定似乎可以工作(我實際上並沒有下載所有 blob,但至少清單返回了正確的回應 - HTTP 200 with layers
)。但正如前面提到的,第一次請求相同的 URL 會返回 HTTP 404。頭,將HTTP 請求更改為HEAD 等。