
Ich habe einen AWS ECR Pull-Through-Cache für das Docker Hub-Register eingerichtet.
Angenommen, es ist verfügbar unter: 123.dkr.ecr.eu-central-1.amazonaws.com/docker
.
Jetzt kann ich nach der Authentifizierung mit:
aws ecr get-login-password ... | docker login 123.dkr.ecr.eu-central-1.amazonaws.com -u AWS --password-stdin
so etwas tun wie docker pull 123.dkr.ecr.eu-central-1.amazonaws.com/docker/library/busybox:latest
.
Das ist alles sinnvoll, aber meine Frage ist, wie das im Hintergrund funktioniert. Wenn ich nämlich eine HTTP-Anfrage mache mit:
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
Ich bekomme
{"errors":[{"code":"MANIFEST_UNKNOWN","message":"Requested image not found"}]}
oder genauer gesagt, beim ersten Mal erhalte ich eine Fehlermeldung, aber nach dem Aufrufen docker pull
(und ich kann sehen, dass das Bild auf ECR zwischengespeichert wurde) funktioniert es.
Ich habe gelesenhttps://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.mdund verstehe das immer noch nicht. Was macht der offizielle Docker-Client anders als meine HTTP-Anfrage, die ECR dazu zwingt, das Image tatsächlich abzurufen und mit dem Zwischenspeichern zu beginnen? Hat das etwas mit der Docker-Authentifizierung zu tun – aber wie signalisiert es, docker
welches Tag genau später angefordert wird?
Denn nachdem es zwischengespeichert wurde, scheint das normale Protokoll zu funktionieren (ich habe nicht wirklich alle Blobs heruntergeladen, aber zumindest gibt Manifests eine richtige Antwort zurück – HTTP 200 mit layers
). Aber wie erwähnt gibt das erste Anfordern derselben URL HTTP 404 zurück. Und ich habe auch versucht, ein bisschen zu warten – ohne Erfolg, meine Anfrage scheint den Prozess des ECR-Downloads des Bildes nie zu starten, obwohl ich versucht habe, User-Agent-Header hinzuzufügen, HTTP-Anfragen in HEAD zu ändern usw. usw.