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)
Respuestas:
Resulta que el Proyecto Moby tiene un script de shell en Moby Github que puede descargar imágenes de Docker Hub en un formato que se puede importar a Docker:
La sintaxis de uso para el script viene dada por lo siguiente:
La imagen se puede importar con
tar
ydocker load
:Para verificar que el script funciona como se esperaba, descargué una imagen de Ubuntu de Docker Hub y la cargué en Docker:
En la práctica, primero tendría que copiar los datos del cliente de Internet (que no tiene Docker instalado) en la máquina de destino / destino (que sí tiene Docker instalado):
y luego cargue y use la imagen en el host de destino:
fuente
The machine with internet connectivity does not and cannot have Docker installed
. pero usted aplicadocker load
Existe una herramienta llamada Skopeo que puede recuperar imágenes de Docker de un repositorio y guardarlas en varios formatos.
Por ejemplo:
Descargue la imagen y guarde las capas como un tarball:
skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
Transfiera
/tmp/ubuntu.tar
a otra máquina si lo desea.Cargue la imagen en una instancia de Docker que no tenga conexión a Internet:
docker load --input /tmp/ubuntu.tar
Está disponible en CentOS 7 repo con el nombre del paquete
skopeo
. No hay paquetes Debian o Ubuntu en este momento (pero es fácil de compilar).fuente
Gracias por la motivación. Hice una versión de PowerShell. Compruébelo ... Con él, puede mover los contenedores de dockerhub a una red de docker restringida con un escritorio de Windows y una herramienta ssh-scp para la máquina docker sin derechos de administrador o root
https://gitlab.com/Jancsoj78/dockerless_docker_downloader una nueva herramienta de hackers :)
fuente
Para mí, no está completamente claro lo que está tratando de lograr y por qué los intentos no son una solución para el problema. Si tuviera que resolver este problema, me gustaría @Tensibai y otras preguntas y respuestas indicadas, haga primero una ventana acoplable en un sistema con conectividad a Internet, guarde la imagen de la ventana acoplable, cópiela en la máquina sin conexión a Internet, cargue la imagen y ejecútela. .
Demostración
No hay imágenes en el sistema A:
Extrae una imagen de dockerhub:
Guardar imagen acoplable:
Copie la imagen del acoplador en systemB y cárguela.
fuente
Aquí hay un script de Python adaptado, que tiene una solución independiente del SO: docker-drag
Úselo así, y creará un archivo TAR que podrá importar utilizando la carga acoplable:
fuente
{}
botón (código) en la barra superior del editor para formatearlo.