Docker Kullanmadan Docker Görüntülerini Docker Hub'dan İndirme


32

Bir Docker Resmini Docker Hub'dan manuel olarak indirmek istiyorum . Daha spesifik olarak, Docker istemci yazılımı yüklü olmayan (ve yapamayan) sınırlı bir ortamda bir makineye Docker Hub'dan Docker Görüntüsü indirmek istiyorum. Bunun resmi API kullanarak mümkün olacağını düşünebilirdim , ancak durum böyle görünmüyor - aşağıdaki tartışmaya bakınız:

Gerçekten de, API görüntü indirmeyi desteklemiyor mu? Bu konuyu çözmenin bir yolu var mı?


GÜNCELLEME 1:

Aşağıdaki ServerFault yayınına rastladım:

Kabul edilen çözümdocker save benim durumumda yardımcı olmayan komutu kullanıyor . Ancak burada yayınlanan başka bir çözüm şu StackOverflow yayınını gösteriyor:

Buradaki çözümlerden biri , diğerlerinin yanı sıra, bir görüntüyü indirmek için bir komut oluşturabilen, docker-registry-debug adlı bir komut satırı aracına işaret eder curl. İşte ne var:

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

Yani ne yazık ki curloluşturulan komut çalışmaz gibi görünüyor .


GÜNCELLEME 2:

Docker Hub'dan katman blobları indirebilirim. İşte şu anda bu konuda gidiyorum.

Bir yetkilendirme jetonu alı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' \
)"

Bir resim listesi çekin:

user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'

Bir resim listesi çekin ve damla toplamlarını çıkarın:

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

Tek bir katman blob indirin ve bir dosyaya yazın:

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"

Blob toplamlarının tümünü bir dosyaya yazın:

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

Katman bloblarının tümünü manifesten indirin:

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

Şimdi bir sürü katman blobum var ve onları bir görüntüye dönüştürmem gerekiyor - sanırım.


İlgili Bağlantılar:


"Daha spesifik olarak, Docker istemci yazılımı yüklü olmayan (ve yapamayan) sınırlı bir ortamda bir makineye Docker Hub'dan Docker Görüntüsü indirmek istiyorum." => Bu makinede görüntülere sahip olmanın amacı ne? (daha kolay bir çözüm geçici bir ana bilgisayar kullanıyor; bunlardan biri dockerhub ve docker save / docker'ı dahili bir kayıt defterine
itdikten

@Tensibai için başka bir makineye kopyalamak yapar Docker var ama yok internet erişimi vardır.
igal

Liman işçisi koduna bir göz attın mı? Temel http çağrılarından böyle bir şey inşa etmeye gitmenin yolu gibi geliyor
Tensibai

@Tensibai Sanırım çözdüm. Ayrıca Docker topluluğundan bir çözüm aldığımı düşünüyorum. Geri gelip çözümü daha sonra bugün postalayacağım.
igal

@Tensibai Sorunu çözen bir kabuk betiği ile bir çözüm yolladım .
igal

Yanıtlar:


23

Böylece, Moby Projesi Moby Github'da Docker Hub'dan Docker'a aktarılabilecek biçimde resimler indirebilecek bir kabuk betiğine sahip :

Komut dosyası için kullanım sözdizimi aşağıdaki gibidir:

download-frozen-image-v2.sh target_dir image[:tag][@digest] ...

Ardından görüntü ile alınabilir tarve docker load:

tar -cC 'target_dir' . | docker load

Komut dosyasının beklendiği gibi çalıştığını doğrulamak için Docker Hub'dan bir Ubuntu görüntüsü indirdim ve Docker'a yükledim:

user@host:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@host:~$ tar -cC 'ubuntu' . | docker load
user@host:~$ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

İlk (yok olan internet istemciden veri kopyalamak Pratikte ben olurdu değil (ki hedef / hedef makineye Docker yüklü) yok Docker yüklü):

user@nodocker:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@nodocker:~$ tar -C 'ubuntu' -cf 'ubuntu.tar' .
user@nodocker:~$ scp ubuntu.tar user@hasdocker:~

ve sonra görüntüyü hedef ana bilgisayara yükleyip kullanın:

user@hasdocker:~ docker load ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

The machine with internet connectivity does not and cannot have Docker installed. ancak başvuruda bulunuyorsunuzdocker load
030

@ 030 Sadece betiğin çalıştığını ve indirme görüntüsü verilerinin Docker'a alınabileceğini test etmek / göstermek için. Uygulamada önce verileri Docker'ın kurulu olduğu bir makineye kopyalamak zorunda kalacağım.
igal

Belki de o kısmı açıklama için ekleyebilirsin
030

2
@ 030 İş akışının pratikte nasıl görüneceğini gösteren örnek bir oturum ekledim.
igal,

7

Denilen bir aracı yoktur Skopeo bir depodan Docker görüntüleri almak ve çeşitli biçimlerde kaydedebilirsiniz.

Örneğin:

  1. Resmi indirin ve katmanları tarball olarak kaydedin: skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu

  2. /tmp/ubuntu.tarİsterseniz başka bir makineye aktarın .

  3. Resmi, internet bağlantısı olmayan bir Docker örneğine yükleyin: docker load --input /tmp/ubuntu.tar

CentOS 7 deposunda paket adıyla bulunur skopeo. Şu anda Debian veya Ubuntu paketi yok (ancak derlenmesi kolaydır).


3

motivasyon için teşekkürler. Powershell versiyonunu yaptım. Şuna bir göz at ... Bununla beraber, dockerhub konteynerlerinde, Windows masaüstüne sahip kısıtlanmış bir docker ağlarına ve kök ya da yönetici haklarına sahip olmayan docker makinesine bir ssh-scp aracı taşıyabilirsiniz

https://gitlab.com/Jancsoj78/dockerless_docker_downloader yeni bir hacker aracı :)

$image = "ubuntu"
$tag = "latest"
$imageuri = "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/"+$image+":pull"
$taguri = "https://registry-1.docker.io/v2/library/"+$image+"/manifests/"+$tag
$bloburi = "https://registry-1.docker.io/v2/library/"+$image+"/blobs/sha256:"

#token request
$token = Invoke-WebRequest -Uri $imageuri | ConvertFrom-Json | Select -expand token

#pull image manifest
$blobs = $($(Invoke-Webrequest -Headers @{Authorization="Bearer $token"} -Method GET -Uri $taguri | ConvertFrom-Json | Select -expand fsLayers ) -replace "sha256:" -replace "@{blobSum=" -replace "}")

#download blobs
for ($i=0; $i -lt $blobs.length; $i++) {
    $blobelement =$blobs[$i]

    Invoke-Webrequest -Headers @{Authorization="Bearer $token"} -Method GET -Uri $bloburi$blobelement -OutFile blobtmp

    $source = "blobtmp"
    $newfile = "$blobelement.gz"

#overwrite
Copy-Item $source $newfile -Force -Recurse
#source blobs
ls *.gz
}
#postprocess
echo "copy these .gz to your docker machine"
echo "docker import .gz backward one by one"
echo "lastone with ubuntu:latest"
echo "after docker export and reimport to make a simple layer image"

1

Bana göre, neyi başarmaya çalıştığınız ve girişimlerin neden sorun için bir çözüm olmadığı tam olarak belli değil. Eğer bu sorunu çözmem gerekiyorsa @Tensibai ve diğer S & I işaretlerini belirtmek isterim, önce internet bağlantısı olan bir sisteme bir docker çekme yapın, docker görüntüsünü kaydedin, internet bağlantısı olmadan makineye kopyalayın, resmi yükleyin ve çalıştırın .

gösteri

A sisteminde görüntü yok:

userA@systemA ~ $ docker images
REPOSITORY        TAG               IMAGE ID          CREATED             SIZE
userA@systemA ~ $

Dockerhub'dan bir resim çekin:

userA@systemA ~ $
docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bc95e04b23c0: Pull complete 
f3186e650f4e: Pull complete 
9ac7d6621708: Pull complete 
Digest: sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887
Status: Downloaded newer image for nginx:latest
userA@systemA ~ $ docker images
REPOSITORY        TAG               IMAGE ID            CREATED             SIZE
nginx             latest            9e7424e5dbae        10 days ago         108MB

Liman görüntüsünü kaydet:

userA@systemA ~ $ docker save nginx -o nginx.tar

Liman işçisi görüntüsünü systemB'ye kopyalayın ve yükleyin.

userB@systemB ~ $ docker load -i nginx.tar
cec7521cdf36: Loading layer  58.44MB/58.44MB
350d50e58b6c: Loading layer  53.76MB/53.76MB
63c39cd4a775: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest
userB@systemB ~ $ docker images
REPOSITORY        TAG               IMAGE ID            CREATED             SIZE
nginx             latest            9e7424e5dbae        10 days ago         108MB

1
İnternet bağlantısına sahip makine Docker yüklü değildir ve bulunamaz. Sorusu bir görüntü indirmek için bir yol istiyor olmadan Docker istemcisi kullanıyorsanız. Çözümü gör .
igal

0

İşte uyarlanmış bir python betiği, bu nedenle işletim sistemi bağımsız bir çözüme sahip: docker-drag

Bu şekilde kullanın ve liman yükünü kullanarak içe aktarabileceğiniz bir TAR arşivi oluşturacaktır:

python docker_pull.py hello-world
python docker_pull.py alpine:3.9
python docker_pull.py kalilinux/kali-linux-docker

1
Eğer github hesabınızı kapatırsanız hiçbir şey kalmaz, paylaşmayı tamamlıyorsanız, bağlantıyı saklayın ama betiği de buraya yapıştırın. Sen edebilirsiniz düzenleyebilir , cevabınızı kodunuzu yapıştırın ve sonra + K veya ctrl onu ve türünü seçin {}biçimlendirmek için editör üst çubuğunda (kod) butonuna.
Tensibai

Kodu buraya yapıştırmak isterdim ama 100 satır uzunluğunda ve okunabilir olacağını sanmıyorum. Bununla birlikte, kodun kendi kopyasını kaydetmek için kodu yazabilirsiniz.
Dutfaz

Bu benim için değil, kendi kendine devam eden bir cevaba sahip olmak, eğer bağlantı koparsa, bunun bir kaç ay içinde bu cevabı okuyan birinin gerçekten yardımcı olabileceğini düşünüyor musunuz? (Bir cevap için maksimum boyut btw 30k karakterdir)
Tensibai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.