Quiero descargar manualmente una imagen de Docker desde Docker Hub . Más específicamente, quiero descargar una imagen de Docker de Docker Hub en una máquina en un entorno restringido que no tiene (y no puede) tener instalado el software del cliente Docker. Pensé que esto sería posible utilizando la API oficial , pero este no parece ser el caso; consulte la siguiente discusión:
¿Es realmente el caso de que la API no admite la descarga de imágenes? ¿Hay alguna manera de evitar esto?
ACTUALIZACIÓN 1:
Me encontré con la siguiente publicación de ServerFault:
La solución aceptada utiliza el docker save
comando, que no ayuda en mi situación. Pero otra solución publicada allí cita la siguiente publicación de StackOverflow:
Una de las soluciones allí se refiere a una herramienta de línea de comandos llamada docker-Registry-Debug que, entre otras cosas, puede generar un curl
comando para descargar una imagen. Esto es lo que obtuve:
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
Desafortunadamente, parece que el curl
comando generado no funciona.
ACTUALIZACIÓN 2:
Parece que puedo descargar blobs de capa desde Docker Hub. Así es como lo estoy haciendo actualmente.
Obtenga un token de autorización:
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' \
)"
Tire de un manifiesto de imagen:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'
Tire de un manifiesto de imagen y extraiga las sumas 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
Descargue un blob de una sola capa y escríbalo en un archivo:
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"
Escriba todas las sumas de blob en un archivo:
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
Descargue todos los blobs de capa del manifiesto:
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
Ahora tengo un montón de capas de blobs y necesito recombinarlas en una imagen, creo.
Enlaces relacionados:
Foros de la comunidad de Docker: Docker Hub API recupera imágenes
Foros de la comunidad de Docker: descarga manual de imágenes de Docker Hub
Docker Issue # 1016: Obtenga imágenes de Docker sin el comando Docker . por ejemplo, con wget
ServerFault: descargando la imagen de Docker para transferirla a una máquina no conectada a Internet
StackOverflow: ¿Cómo descargar imágenes de la ventana acoplable sin usar el comando de extracción?
StackOverflow: URL del registro oficial de Docker (Docker Hub)