डॉकर हब से डॉकर का उपयोग किए बिना डॉकर छवियां डाउनलोड करना


32

मैं मैन्युअल रूप से डॉकर हब से एक डॉकर छवि डाउनलोड करना चाहता हूं । अधिक विशेष रूप से, मैं एक मशीन पर डॉकर हब से डॉकर छवि डाउनलोड करना चाहता हूं जो प्रतिबंधित वातावरण में है (जो नहीं कर सकता है) डॉकर क्लाइंट सॉफ़्टवेयर स्थापित है। मैंने सोचा होगा कि यह आधिकारिक एपीआई का उपयोग करना संभव होगा , लेकिन ऐसा प्रतीत नहीं होता है - निम्नलिखित चर्चा देखें:

क्या वास्तव में यह मामला है कि एपीआई छवियों को डाउनलोड करने का समर्थन नहीं करता है? क्या इसके आसपास काम करने का कोई तरीका है?


अद्यतन 1:

मैं निम्नलिखित सर्वरफॉल्ट पोस्ट पर आया:

स्वीकार किए जाते हैं समाधान का उपयोग करता है docker saveआदेश है, जो मेरी स्थिति में मदद नहीं करता है। लेकिन वहाँ तैनात एक अन्य समाधान निम्नलिखित StackOverflow पोस्ट का हवाला देता है:

वहाँ समाधान में से एक कमांड-लाइन टूल को संदर्भित करता है जिसे डॉक-रजिस्ट्री-डिबग कहा जाता है , जो अन्य चीजों के अलावा, curlएक छवि को डाउनलोड करने के लिए एक कमांड उत्पन्न कर सकता है । यह है जो मुझे मिला:

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

इसलिए दुर्भाग्य से ऐसा लगता है कि curlउत्पन्न कमांड काम नहीं करता है।


अद्यतन 2:

ऐसा लगता है कि मैं डॉकर हब से लेयर ब्लॉब्स डाउनलोड करने में सक्षम हूं। यहाँ है कि मैं वर्तमान में इसके बारे में कैसे जा रहा हूँ।

एक प्राधिकरण टोकन प्राप्त करें:

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' \
)"

एक छवि प्रकट करें:

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

एक छवि प्रकट करें और बूँद रकम निकालें:

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

एकल परत बूँद डाउनलोड करें और इसे एक फ़ाइल में लिखें:

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"

एक फाइल में सभी बूँद रकम लिखें:

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

मैनिफ़ेस्ट से परत की सभी परतें डाउनलोड करें:

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

अब मेरे पास परत की एक गुच्छा है और मुझे उन्हें एक छवि में फिर से जोड़ने की आवश्यकता है - मुझे लगता है।


सम्बंधित लिंक्स:


"अधिक विशेष रूप से, मैं एक मशीन पर डॉकर हब से डॉकर छवि डाउनलोड करना चाहता हूं, जो प्रतिबंधित वातावरण में नहीं है (और नहीं कर सकते हैं) डॉकर क्लाइंट सॉफ़्टवेयर स्थापित है।" => इस मशीन पर चित्र लगाने का क्या मतलब है? (आसान वर्कअवे एक पिवट होस्ट का उपयोग कर रहा है, जहां आप dockerhub से don खींचते हैं और docker save /
docker के

@Tensibai करने के लिए एक और मशीन है कि करने के लिए इसे कॉपी करता डोकर है, लेकिन यह नहीं है इंटरनेट का उपयोग कर सकते है।
alगल

क्या आपके पास docker pull कोड पर एक नज़र थी? यह मूल http कॉल से कुछ इस तरह का निर्माण करने के लिए जाने का रास्ता लगता है
Tensibai

@ टेंसिबाई मुझे लगता है कि मैंने इसका पता लगा लिया। मुझे भी लगता है कि मुझे डॉकर समुदाय से एक समाधान मिला। मैं वापस आऊंगा और आज बाद में समाधान पोस्ट करूंगा।
Igal

@ तेंसिबाई मैंने एक शेल स्क्रिप्ट के साथ एक समाधान पोस्ट किया जो समस्या को हल करता है।
गाल 13

जवाबों:


23

तो यह पता चला कि मोबी प्रोजेक्ट में मोबी गिथब पर एक शेल स्क्रिप्ट है जो डॉकर हब से एक प्रारूप में छवियों को डाउनलोड कर सकता है जिसे डॉकर में आयात किया जा सकता है:

स्क्रिप्ट के लिए उपयोग वाक्यविन्यास निम्नलिखित द्वारा दिया गया है:

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

छवि तो साथ आयात किया जा सकता tarऔर docker load:

tar -cC 'target_dir' . | docker load

यह सत्यापित करने के लिए कि स्क्रिप्ट अपेक्षित रूप से काम करती है, मैंने डॉकर हब से एक उबंटू छवि डाउनलोड की और इसे डॉकर में लोड किया:

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:/#

व्यवहार में मैं पहली बार (जो है इंटरनेट ग्राहक से डेटा कॉपी करने के लिए होता नहीं डोकर स्थापित) लक्ष्य / गंतव्य मशीन के लिए (जो करता डोकर स्थापित होना):

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:~

और फिर लक्ष्य होस्ट पर छवि को लोड और उपयोग करें:

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। लेकिन आप लागूdocker load
030

@ 030 यह जांचने / प्रदर्शित करने के लिए कि स्क्रिप्ट काम करती है और डाउनलोड छवि डेटा को डॉकर में आयात किया जा सकता है। व्यवहार में, मुझे सबसे पहले डॉकर को स्थापित मशीन से डेटा कॉपी करना होगा।
alगल डिक

शायद आप स्पष्टीकरण के लिए वह हिस्सा जोड़ सकता है
030

2
@ 030 मैंने एक उदाहरण सत्र जोड़ा, जिसमें दर्शाया गया है कि व्यवहार में वर्कफ़्लो कैसा दिखेगा।
alगल डिक

7

स्कोपो नामक एक उपकरण है जो डॉकर छवियों को एक रिपॉजिटरी से पुनर्प्राप्त कर सकता है और उन्हें कई स्वरूपों में सहेज सकता है।

उदाहरण के लिए:

  1. छवि डाउनलोड करें और टारबॉल के रूप में परतों को बचाएं: skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu

  2. /tmp/ubuntu.tarयदि वांछित हो तो दूसरी मशीन में स्थानांतरित करें।

  3. एक डॉकर उदाहरण पर छवि को लोड करें जिसमें इंटरनेट कनेक्शन नहीं है: docker load --input /tmp/ubuntu.tar

यह पैकेज नाम के साथ CentOS 7 रेपो में उपलब्ध है skopeo। इस समय कोई डेबियन या उबंटू पैकेज नहीं हैं (लेकिन यह संकलन करना आसान है)।


3

प्रेरणा के लिए धन्यवाद। मैंने इसका एक पॉवरशेल संस्करण बनाया। इसे देखें ... इसके साथ आप dockerhub कंटेनरों में एक विंडोज़ डेस्कटॉप और एक ssh-scp टूल के साथ एक प्रतिबंधित docker नेटवर्कों में बिना रूट या एडमिनिस्ट्रेटर अधिकारों के डॉकटर मशीन में जा सकते हैं।

https://gitlab.com/Jancsoj78/dockerless_docker_downloader एक नया हैकर टूल :)

$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

मेरे लिए यह पूरी तरह से स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं और प्रयास समस्या का हल क्यों नहीं हैं। अगर मुझे इस मुद्दे को हल करने की आवश्यकता है, तो मैं @Tensibai और अन्य प्रश्नोत्तर को इंगित करना चाहूंगा, क्या एक डॉकटर इंटरनेट कनेक्टिविटी के साथ एक सिस्टम पर सबसे पहले खींचता है, डॉक छवि को सहेजें, इसे इंटरनेट कनेक्टिविटी के बिना मशीन पर कॉपी करें, छवि लोड करें और इसे चलाएं ।

प्रदर्शन

सिस्टम A पर कोई चित्र नहीं हैं:

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

डॉकहब से एक छवि खींचो:

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

Docker चित्र सहेजें:

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

DoB छवि को SystemB पर कॉपी करें और लोड करें।

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
इंटरनेट कनेक्टिविटी वाली मशीन में डॉकर स्थापित नहीं हो सकता है। सवाल डॉकर क्लाइंट का उपयोग किए बिना एक छवि डाउनलोड करने का तरीका पूछ रहा है । मेरा समाधान देखें ।
इगंल

0

यहाँ एक अनुकूलित अजगर स्क्रिप्ट है, इस प्रकार एक OS स्वतंत्र समाधान है: docker-drag

इसका उपयोग उस तरह करें, और यह एक TAR आर्काइव बनाएगा जिसे आप docker load का उपयोग करके आयात कर पाएंगे:

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

1
यदि आप अपना जीथब खाता बंद करते हैं तो कुछ भी नहीं बचा है, यदि आप इसे साझा करने के साथ ठीक हैं, तो लिंक रखें लेकिन स्क्रिप्ट को यहां भी पेस्ट करें। आप अपना उत्तर संपादित कर सकते हैं , अपना कोड पेस्ट कर सकते हैं और फिर इसे चुन सकते हैं और {}इसे प्रारूपित करने के लिए संपादक शीर्ष बार में ctrl + K या (कोड) बटन टाइप कर सकते हैं।
तैंसिबाई

मैं यहाँ कोड चिपकाना पसंद करूंगा लेकिन यह 100 पंक्तियों का है और मुझे नहीं लगता कि यह पठनीय होगा। फिर भी, आप स्क्रिप्ट की अपनी प्रतिलिपि को बचाने के लिए कोड को कांटा कर सकते हैं।
Dutfaz

यह मेरे लिए नहीं है, कि एक उत्तर है जो स्वयं को बनाए रखने के लिए है, यदि लिंक टूट जाता है, तो क्या आपको वास्तव में लगता है कि यह कुछ महीनों में इस उत्तर को पढ़ने में किसी की मदद कर सकता है? (एक उत्तर के लिए अधिकतम आकार btw 30k अक्षर है)
Tensibai
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.