
Eu configurei um cache pull-through do AWS ECR para o registro do Docker Hub.
Digamos que esteja disponível em: 123.dkr.ecr.eu-central-1.amazonaws.com/docker
.
Agora, depois de autenticar usando:
aws ecr get-login-password ... | docker login 123.dkr.ecr.eu-central-1.amazonaws.com -u AWS --password-stdin
posso fazer algo como docker pull 123.dkr.ecr.eu-central-1.amazonaws.com/docker/library/busybox:latest
.
Tudo isso faz sentido, mas minha pergunta é como isso funciona nos bastidores, porque se eu fizer uma solicitação HTTP usando:
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
eu recebo
{"errors":[{"code":"MANIFEST_UNKNOWN","message":"Requested image not found"}]}
ou, para ser mais preciso, na primeira vez que recebo um erro, mas depois de invocar docker pull
(e posso ver que a imagem foi armazenada em cache no ECR), ele começa a funcionar.
Eu lihttps://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.mde ainda não entendo isso. O que o cliente docker oficial faz de diferente da minha solicitação HTTP que força o ECR a extrair a imagem e começar a armazená-la em cache? Está relacionado à autenticação do docker - mas como docker
sinaliza exatamente qual tag será solicitada posteriormente?
Porque depois de armazenado em cache, o protocolo normal parece funcionar (na verdade, não baixei todos os blobs, mas pelo menos o manifesto retorna uma resposta adequada - HTTP 200 com layers
). Mas, como mencionei, apenas solicitar o mesmo URL na primeira vez retorna HTTP 404. E também tentei esperar um pouco - sem sorte, minha solicitação parece nunca iniciar o processo de download da imagem pelo ECR, apesar de tentar adicionar o User-Agent cabeçalhos, alterando solicitações HTTP para HEAD etc.