Chcę ręcznie pobrać obraz Docker z Docker Hub . Mówiąc dokładniej, chcę pobrać obraz Docker z Docker Hub na maszynie w ograniczonym środowisku, które nie ma (i nie może) mieć zainstalowanego oprogramowania klienckiego Docker. Myślałem, że byłoby to możliwe przy użyciu oficjalnego interfejsu API , ale nie wydaje się, że tak jest - patrz następująca dyskusja:
Czy tak naprawdę jest tak, że interfejs API nie obsługuje pobierania obrazów? Czy istnieje sposób na obejście tego?
AKTUALIZACJA 1:
Natrafiłem na następujący wpis ServerFault:
Przyjętego rozwiązania korzysta z docker save
komendy, która nie pomaga w mojej sytuacji. Ale inne opublikowane tam rozwiązanie cytuje następujący post StackOverflow:
Jedno z rozwiązań odnosi się do narzędzia wiersza polecenia o nazwie docker-register-debug, które między innymi może wygenerować curl
polecenie pobierania obrazu. Oto co mam:
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
Niestety wygląda na to, że curl
wygenerowane polecenie nie działa.
AKTUALIZACJA 2:
Wygląda na to, że mogę pobrać obiekty BLOB warstwy z Docker Hub. Oto, w jaki sposób obecnie o tym mówię.
Uzyskaj token autoryzacji:
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' \
)"
Wyciągnij manifest obrazu:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'
Wyciągnij manifest obrazu i wyodrębnij sumy kropli:
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
Pobierz jednowarstwowy obiekt blob i zapisz go do pliku:
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"
Zapisz wszystkie sumy obiektów blob do pliku:
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
Pobierz wszystkie obiekty BLOB warstwy z manifestu:
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
Teraz mam kilka warstwowych obiektów blob i muszę je ponownie połączyć w obraz - tak myślę.
Powiązane linki:
Fora społeczności Docker: ręczne pobieranie obrazów Docker Hub
Problem z dokowaniem nr 1016: Pobieranie obrazów dokera bez polecenia dokera . np. z wget
Błąd serwera: pobieranie obrazu dokera w celu przesłania go na maszynę niepołączoną z Internetem
StackOverflow: Pobieranie obrazu dokera w celu przesłania go na maszynę niepołączoną z Internetem
StackOverflow: Jak pobierać obrazy dokerów bez użycia polecenia pull?
Odpowiedzi:
Okazuje się, że Moby Project ma skrypt powłoki na Moby Github, który może pobierać obrazy z Docker Hub w formacie, który można zaimportować do Docker:
Składnia użycia skryptu jest następująca:
Obraz można następnie zaimportować za pomocą
tar
idocker load
:Aby sprawdzić, czy skrypt działa zgodnie z oczekiwaniami, pobrałem obraz Ubuntu z Docker Hub i załadowałem go do Docker:
W praktyce musiałbym najpierw skopiować dane z klienta internetowego (który ma nie mieć zainstalowany Docker) do docelowej / maszyny docelowej (który ma być zainstalowany Docker):
a następnie załaduj i użyj obrazu na hoście docelowym:
źródło
The machine with internet connectivity does not and cannot have Docker installed
. ale aplikujeszdocker load
Istnieje narzędzie o nazwie Skopeo, które może pobierać obrazy Docker z repozytorium i zapisywać je w kilku formatach.
Na przykład:
Pobierz obraz i zapisz warstwy jako tarball:
skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
W
/tmp/ubuntu.tar
razie potrzeby przenieś na inną maszynę.Załaduj obraz do instancji Docker, która nie ma połączenia z Internetem:
docker load --input /tmp/ubuntu.tar
Jest dostępny w repozytorium CentOS 7 z nazwą pakietu
skopeo
. Obecnie nie ma pakietów Debian ani Ubuntu (ale łatwo je skompilować).źródło
dzięki za motywację. Zrobiłem wersję PowerShell. Sprawdź to ... Dzięki niemu możesz przenosić kontenery dockerhub do ograniczonych sieci dokerów z pulpitem systemu Windows i narzędziem ssh-scp do maszyny dokującej bez uprawnień użytkownika root lub administratora
https://gitlab.com/Jancsoj78/dockerless_docker_downloader nowe narzędzie hakera :)
źródło
Dla mnie nie jest całkowicie jasne, co próbujesz osiągnąć i dlaczego próby nie są rozwiązaniem problemu. Gdybym musiał rozwiązać ten problem, chciałbym @Tensibai i inne pytania i odpowiedzi, jak wskazano, najpierw wykonaj dokerowanie w systemie z łącznością internetową, zapisz obraz dokera, skopiuj go na maszynę bez połączenia z Internetem, załaduj obraz i uruchom go .
Demonstracja
Brak obrazu w systemie A:
Wyciągnij obraz z dockerhub:
Zapisz obraz dokera:
Skopiuj obraz dokera do systemu B i załaduj go.
źródło
Oto dostosowany skrypt Pythona, który ma rozwiązanie niezależne od systemu operacyjnego: docker-drag
Użyj go w ten sposób, aby utworzyć archiwum TAR, które będziesz mógł zaimportować za pomocą obciążenia dokera:
źródło
{}
(kod) na górnym pasku edytora, aby go sformatować.