Ich möchte ein Docker-Image manuell von Docker Hub herunterladen . Insbesondere möchte ich ein Docker-Image von Docker Hub auf einen Computer in einer eingeschränkten Umgebung herunterladen, auf dem die Docker-Client-Software nicht installiert ist (und nicht installiert werden kann). Ich hätte gedacht, dass dies mit der offiziellen API möglich wäre , aber dies scheint nicht der Fall zu sein - siehe folgende Diskussion:
Ist es wirklich so, dass die API das Herunterladen von Bildern nicht unterstützt? Gibt es eine Möglichkeit, dies zu umgehen?
UPDATE 1:
Ich bin auf folgenden ServerFault-Beitrag gestoßen:
Die akzeptierte Lösung verwendet den docker save
Befehl, der in meiner Situation nicht hilft. Eine andere dort veröffentlichte Lösung nennt jedoch den folgenden StackOverflow-Beitrag:
Eine der dortigen Lösungen bezieht sich auf ein Befehlszeilentool namens Docker-Registry-Debug, das unter anderem einen curl
Befehl zum Herunterladen eines Bildes generieren kann . Folgendes habe ich bekommen:
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
Es sieht also leider so aus, als würde der curl
generierte Befehl nicht funktionieren.
UPDATE 2:
Es sieht so aus, als ob ich Layer-Blobs von Docker Hub herunterladen kann. Hier ist, wie ich es gerade mache.
Holen Sie sich ein Autorisierungstoken:
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' \
)"
Ziehen Sie ein Bildmanifest:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'
Ziehen Sie ein Bildmanifest und extrahieren Sie die Blobsummen:
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
Laden Sie einen einzelnen Layer-Blob herunter und schreiben Sie ihn in eine Datei:
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"
Schreiben Sie alle Blobsummen in eine Datei:
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
Laden Sie alle Layer-Blobs aus dem Manifest herunter:
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
Jetzt habe ich ein paar Layer-Blobs, die ich zu einem Bild zusammenfügen muss - glaube ich.
Ähnliche Links:
Docker Community-Foren: Docker Hub-API zum Abrufen von Bildern
Docker Community-Foren: Manueller Download von Docker Hub-Images
Docker-Problem Nr. 1016: Abrufen von Docker-Bildern ohne Docker-Befehl. zB mit wget
StackOverflow: Wie lade ich Docker-Bilder herunter, ohne den Befehl pull zu verwenden?
StackOverflow: Offizielle Docker-Registrierungs-URL (Docker Hub)
Antworten:
Es stellt sich also heraus, dass das Moby-Projekt ein Shell-Skript auf dem Moby Github hat, mit dem Bilder von Docker Hub in einem Format heruntergeladen werden können, das in Docker importiert werden kann:
Die Verwendungssyntax für das Skript lautet wie folgt:
Das Bild kann dann mit
tar
und importiert werdendocker load
:Um sicherzustellen, dass das Skript wie erwartet funktioniert, habe ich ein Ubuntu-Image von Docker Hub heruntergeladen und in Docker geladen:
In der Praxis würde ich zuerst müssen die Daten aus dem Internet Client kopieren (was nicht nicht Docker installiert ist ) an das Ziel / Zielmaschine (die nicht Docker installiert ist ):
Laden Sie das Image und verwenden Sie es auf dem Zielhost:
quelle
The machine with internet connectivity does not and cannot have Docker installed
. aber Sie bewerben sichdocker load
Es gibt ein Tool namens Skopeo, mit dem Docker-Bilder aus einem Repository abgerufen und in verschiedenen Formaten gespeichert werden können.
Beispielsweise:
Lade das Bild herunter und speichere die Ebenen als Tarball:
skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
Übertragen
/tmp/ubuntu.tar
auf eine andere Maschine , falls gewünscht.Laden Sie das Image auf eine Docker-Instanz ohne Internetverbindung:
docker load --input /tmp/ubuntu.tar
Es ist in CentOS 7 Repo mit dem Paketnamen verfügbar
skopeo
. Zur Zeit gibt es keine Debian- oder Ubuntu-Pakete (aber es ist einfach zu kompilieren).quelle
danke für die motivation. Ich habe eine Powershell-Version davon gemacht. Probieren Sie es aus ... Damit können Sie in Dockerhub-Containern mit einem Windows-Desktop und einem SSH-SCP-Tool ohne Root- oder Administratorrechte zu einem eingeschränkten Docker-Netzwerk wechseln
https://gitlab.com/Jancsoj78/dockerless_docker_downloader ein neues Hacker-Tool :)
quelle
Mir ist nicht ganz klar, was Sie erreichen wollen und warum die Versuche keine Lösung für das Problem sind. Wenn ich dieses Problem lösen müsste, möchte ich, dass @Tensibai und andere Fragen und Antworten angezeigt werden. Führen Sie zuerst einen Docker-Pull auf einem System mit Internetverbindung aus, speichern Sie das Docker-Image, kopieren Sie es auf den Computer ohne Internetverbindung, laden Sie das Image und führen Sie es aus .
Demonstration
Auf System A sind keine Bilder vorhanden:
Ein Bild von dockerhub ziehen:
Docker-Bild speichern:
Kopieren Sie das Docker-Image nach systemB und laden Sie es.
quelle
Hier ist ein angepasstes Python-Skript, das eine vom Betriebssystem unabhängige Lösung bietet: Docker-Drag
Verwenden Sie es wie folgt und erstellen Sie ein TAR-Archiv, das Sie mit docker load importieren können:
quelle
{}
Schaltfläche (Code) in der oberen Leiste des Editors eingeben, um sie zu formatieren.