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?
Réponses:
Il s'avère donc que le projet Moby a un script shell sur le Moby Github qui peut télécharger des images à partir de Docker Hub dans un format qui peut être importé dans Docker:
La syntaxe d'utilisation du script est donnée par ce qui suit:
L'image peut ensuite être importée avec
tar
etdocker load
:Pour vérifier que le script fonctionne comme prévu, j'ai téléchargé une image Ubuntu depuis Docker Hub et l'ai chargée dans Docker:
Dans la pratique , je dois d' abord copier les données du client Internet (qui ne pas avoir installé Docker) sur la machine cible / destination (qui n'ont Docker installé):
puis chargez et utilisez l'image sur l'hôte cible:
la source
The machine with internet connectivity does not and cannot have Docker installed
. mais vous postulezdocker load
Il existe un outil appelé Skopeo qui peut récupérer des images Docker à partir d'un référentiel et les enregistrer dans plusieurs formats.
Par exemple:
Téléchargez l'image et enregistrez les calques sous forme de tarball:
skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
Transférez
/tmp/ubuntu.tar
sur une autre machine si vous le souhaitez.Chargez l'image sur une instance Docker qui n'a pas de connexion Internet:
docker load --input /tmp/ubuntu.tar
Il est disponible dans le dépôt CentOS 7 avec le nom du package
skopeo
. Il n'y a pas de paquets Debian ou Ubuntu pour le moment (mais c'est facile à compiler).la source
merci pour la motivation. J'en ai fait une version PowerShell. Check it out ... Avec lui, vous pouvez vous déplacer dans des conteneurs Dockerhub vers un réseau Docker restreint avec un bureau Windows et un outil ssh-scp vers Docker Machine sans droits root ou administrateur
https://gitlab.com/Jancsoj78/dockerless_docker_downloader un nouvel outil de piratage :)
la source
Pour moi, il n'est pas complètement clair ce que vous essayez de réaliser et pourquoi les tentatives ne sont pas une solution au problème. Si j'ai besoin de résoudre ce problème, j'aimerais que @Tensibai et les autres questions et réponses soient indiquées, faites d'abord un docker tirer sur un système avec connectivité Internet, enregistrez l'image docker, copiez-la sur la machine sans connexion Internet, chargez l'image et exécutez-la .
Manifestation
Il n'y a pas d'images sur le système A:
Extraire une image de dockerhub:
Enregistrer l'image de docker:
Copiez l'image docker sur systemB et chargez-la.
la source
Voici un script python adapté, ayant ainsi une solution indépendante du système d'exploitation: docker-drag
Utilisez-le comme ça, et cela créera une archive TAR que vous pourrez importer en utilisant la charge docker:
la source
{}
bouton (code) dans la barre supérieure de l'éditeur pour le formater.