Je souhaite télécharger manuellement une image Docker depuis Docker Hub . Plus précisément, je souhaite télécharger une image Docker depuis Docker Hub sur une machine dans un environnement restreint sur lequel le logiciel client Docker n'est pas (et ne peut pas) être installé. J'aurais pensé que cela serait possible en utilisant l' API officielle , mais cela ne semble pas être le cas - voir la discussion suivante:
Est-il vraiment vrai que l'API ne prend pas en charge le téléchargement d'images? Y a-t-il un moyen de contourner cela?
MISE À JOUR 1:
Je suis tombé sur le post ServerFault suivant:
La solution acceptée utilise la docker save
commande, ce qui n'aide pas dans ma situation. Mais une autre solution publiée ici cite le post StackOverflow suivant:
L'une des solutions fait référence à un outil en ligne de commande appelé docker-registry-debug qui, entre autres, peut générer une curl
commande pour télécharger une image. Voici ce que j'ai obtenu:
user@host:~$ docker-registry-debug curlme docker ubuntu
# Reading user/passwd from env var "USER_CREDS"
# No password provided, disabling auth
# Getting token from https://index.docker.io
# Got registry endpoint from the server: https://registry-1.docker.io
# Got token: signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read
curl -i --location-trusted -I -X GET -H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read" https://registry-1.docker.io/v1/images/ubuntu/layer
user@host:~$ curl \
-i --location-trusted -I -X GET \
-H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read"
https://registry-1.docker.io/v1/images/ubuntu/layer
HTTP/1.1 404 NOT FOUND
Server: gunicorn/18.0
Date: Wed, 29 Nov 2017 01:00:00 GMT
Expires: -1
Content-Type: application/json
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 29
X-Docker-Registry-Version: 0.8.15
X-Docker-Registry-Config: common
Strict-Transport-Security: max-age=31536000
Malheureusement, il semble que la curl
commande générée ne fonctionne pas.
MISE À JOUR 2:
Il semble que je puisse télécharger des objets blob de couches à partir de Docker Hub. Voici comment je procède actuellement.
Obtenez un jeton d'autorisation:
user@host:~$ export TOKEN=\
"$(curl \
--silent \
--header 'GET' \
"https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull" \
| jq -r '.token' \
)"
Tirez un manifeste d'image:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'
Tirez un manifeste d'image et extrayez les sommes de blob:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum'
sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
sha256:be588e74bd348ce48bb7161350f4b9d783c331f37a853a80b0b4abc0a33c569e
sha256:e4ce6c3651b3a090bb43688f512f687ea6e3e533132bcbc4a83fb97e7046cea3
sha256:421e436b5f80d876128b74139531693be9b4e59e4f1081c9a3c379c95094e375
sha256:4c7380416e7816a5ab1f840482c9c3ca8de58c6f3ee7f95e55ad299abbfe599f
sha256:660c48dd555dcbfdfe19c80a30f557ac57a15f595250e67bfad1e5663c1725bb
Téléchargez un blob monocouche et écrivez-le dans un fichier:
user@host:~$ BLOBSUM=\
"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
user@host:~$ curl \
--silent \
--location \
--request GET \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"
Écrivez toutes les sommes blob dans un fichier:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum' > ubuntu-blobsums.txt
Téléchargez tous les blobs de calques du manifeste:
user@host:~$ while read BLOBSUM; do
curl \
--silent \
--location \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"; \
done < blobsums.txt
Maintenant, j'ai un tas de taches de calque et je dois les recombiner en une image - je pense.
Liens connexes:
Forums de la communauté Docker: l' API Docker Hub récupère des images
Forums de la communauté Docker: Téléchargement manuel des images Docker Hub
Docker Issue # 1016: Récupérer des images de docker sans commande docker. par exemple avec wget
StackOverflow: Comment télécharger des images de docker sans utiliser la commande pull?