La description
Nous utilisons le référentiel privé docker sur docker hub, lorsque nous avons plus de 10 images.
Nous voulons obtenir des informations sur les images docker du hub docker pour pouvoir comparer les images construites et actuellement présentées sur le hub docker.
J'essaie d'utiliser curl pour obtenir un jeton d'authentification en exécutant des commandes que je trouve dans google.
On dirait:
UNAME="exampleuser"
UPASS="examplepass"
PRODUCT="examplecompany"
REPOSITORY="$PRODUCT"
SERVICE="exampleservice"
J'essaie d'obtenir des jetons de la manière suivante :
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=index.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME&offline_token=true" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:$SERVICE:pull&account=$UNAME&offline_token=true" | jq -r .token)
TOKEN=$(curl -u $UNAME:$UPASS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:$SERVICE&account=$UNAME&offline_token=true" | jq -r .token)
Dans tous les cas, j'obtiens un jeton, j'essaye d'obtenir un manifeste à partir de mon référentiel privé, de la manière suivante :
1.
REPO="$PRODUCT/$SERVICE"
TAG=latest
REGISTRY=https://registry-1.docker.io/v2
URI="$REGISTRY/$REPO/manifests/$TAG"
echo URI=$URI
MANIFEST="`curl -skL -o /dev/null -D- $URI`"
CHALLENGE="`grep "Www-Authenticate" <<<"$MANIFEST"`"
if [[ CHALLENGE ]]; then
IFS=\" read _ REALM _ SERVICE _ SCOPE _ <<<"$CHALLENGE"
echo REALM is $REALM
echo SERVICE is $SERVICE
echo SCOPE is $SCOPE
TOKEN="`curl -skL "$REALM?service=$SERVICE&scope=$SCOPE"`"
IFS=\" read _ _ _ TOKEN _ <<<"$TOKEN"
echo TOKEN is $TOKEN
MANIFEST="`curl -isk -X GET -H "Authorization: Bearer $TOKEN" $URI`"
echo "RESPONSE is $MANIFEST"
fi
2.
curl -s -D - -H "Authorization: Bearer ${TOKEN}" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://index.docker.io/v2/repositories/$PRODUCT/$SERVICE/manifests/latest
Obtenez toujours
RESPONSE is HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="examplecompany/exampleservice:pull",error="insufficient_scope"
Date: Wed, 15 Mar 2017 16:15:52 GMT
Content-Length: 155
Strict-Transport-Security: max-age=31536000
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"examplecompany/exampleservice","Action":"pull"}]}]}
Comment corriger l'obtention de toutes les informations nécessaires pour moi à partir du hub docker?
Lorsque j'essaie d'obtenir des balises via
REPO_LIST=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${PRODUCT}/?page_size=10000 | jq -r '.results|.[]|.name')
Je n'ai pas de problèmes.
De plus, je ne trouve aucun moyen de travailler pour faire ce que je veux.
Étapes pour reproduire le problème :
Décrivez les résultats que vous avez reçus :
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"examplecompany/exampleservice","Action":"pull"}]}]}
Décrivez les résultats que vous attendiez :
Json qui contient des informations sur les images actuellement présentées sur le hub docker.
La discussion sur https://github.com/docker/docker/issues/29257#issuecomment -266121974 est probablement liée ici
Hé @westsouthnight , peut-être que ce script peut vous aider : https://gist.github.com/cirocosta/fb6b90cb7651ff21eda4838a73e3710b .
Il n'utilise pas -u
pour effectuer l'authentification de base lors de la récupération du jeton mais j'ai testé avec un référentiel privé et l'ajout de -u
à get_token() {
fonctionne en effet : avec un registre privé I peut récupérer le registre uniquement si -u
est utilisé.
curl \
-u user:pass \
--silent \
"https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io" \
| jq -r '.token'
Dites moi si ça aide
Permettez-moi de clore ce problème, car le suivi des problèmes GitHub n'est pas vraiment conçu comme un forum d'assistance général,
mais pour signaler des bogues et des demandes de fonctionnalités. Pour d'autres types de questions, envisagez d'utiliser l'un des éléments suivants :
Cette question n'est pas non plus directement liée au code source de ce référentiel, mais à Docker Hub (et à l'authentification qui y est utilisée). Mais n'hésitez pas à continuer la conversation