ডকার ব্যবহার না করে ডকার হাব থেকে ডকার চিত্রগুলি ডাউনলোড করা


32

আমি ম্যানুয়ালি ডকার হাব থেকে একটি ডকার চিত্র ডাউনলোড করতে চাই । আরও সুনির্দিষ্টভাবে, আমি একটি সীমাবদ্ধ পরিবেশে একটি মেশিনে ডকার হাব থেকে একটি ডকার চিত্র ডাউনলোড করতে চাই যা ডকার ক্লায়েন্ট সফ্টওয়্যার ইনস্টল করে না (এবং পারে না)। আমি ভাবতাম যে এটি অফিসিয়াল এপিআই ব্যবহার করে সম্ভব হবে , তবে এটি এমনটি বলে মনে হচ্ছে না - নীচের আলোচনাটি দেখুন:

সত্যিই কি এমন ঘটনা ঘটেছে যে এপিআই চিত্র ডাউনলোড করতে সমর্থন করে না? এখানে কাজ করার একটি উপায় আছে কি?


আপডেট 1:

আমি নিম্নলিখিত সার্ভারফল্ট পোস্ট জুড়ে এসেছি:

গৃহীত সমাধান ব্যবহার docker saveকমান্ড যা আমার অবস্থায় সাহায্য করে না। তবে সেখানে পোস্ট করা আরও একটি সমাধান নিম্নলিখিত স্ট্যাক ওভারফ্লো পোস্টটির উদ্ধৃতি দিয়েছে:

সেগুলির সমাধানগুলির মধ্যে একটি কমান্ড-লাইন সরঞ্জামকে বোঝায় যা ডকার-রেজিস্ট্রি-ডিবাগ নামে পরিচিত যা অন্যান্য জিনিসগুলির মধ্যে 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

এখন আমার কাছে একগুচ্ছ স্তর ব্লব রয়েছে এবং সেগুলি একটি চিত্রের মধ্যে পুনরায় সংযুক্ত করা দরকার - আমার মনে হয়।


সম্পর্কিত লিংক:


"আরও সুনির্দিষ্টভাবে বলতে চাই যে আমি ডকর হাব থেকে একটি মেশিনে একটি ডোকর হাব থেকে একটি সীমাবদ্ধ পরিবেশে ডাউনলোড করতে চাই যা ডকার ক্লায়েন্ট সফ্টওয়্যার ইনস্টল করে না (এবং পারে না))" => তারপরে এই মেশিনে চিত্রগুলি রাখার কী দরকার? (সহজ কাজটি একটি পিভট হোস্টকে ব্যবহার করছে, যেখানে আপনি ডকারহাব থেকে ডকার টানেন এবং ডকার সেভ /
ডকারের

@Tensibai আরেকটি মেশিন যে কপি করে Docker আছে কিন্তু নেই ইন্টারনেট এক্সেস আছে।
igal

আপনি কি ডকার পুল কোডটি দেখেছেন? বেসিক HTTP কলগুলি থেকে
তেমন

@ তেনসিবাই আমার মনে হয় আমি এটি বের করে ফেলেছি। আমিও মনে করি ডকার সম্প্রদায় থেকে আমি একটি সমাধান পেয়েছি। আমি আজ ফিরে এসে সমাধান পোস্ট করব।
igal

@ তেনসিবাই আমি একটি শেল স্ক্রিপ্ট সহ একটি সমাধান পোস্ট করেছি যা সমস্যার সমাধান করে।
igal

উত্তর:


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

বাস্তবে আমি প্রথম (যা নেই ইন্টারনেট ক্লায়েন্ট থেকে তথ্য কপি করতে হবে না Docker ইনস্টল করা আছে) লক্ষ্য / গন্তব্য মেশিনে (যা নেই Docker ইনস্টল করা আছে):

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 কেবল পরীক্ষা / প্রদর্শনের জন্য যে স্ক্রিপ্টটি কাজ করে এবং ডাউনলোড চিত্রের ডেটা ডকারে আমদানি করা যায়। অনুশীলনে আমি প্রথমে ডকার ইনস্টল করা একটি মেশিনে ডেটা অনুলিপি করতে হবে।
ইগাল

সম্ভবত আপনি সেই অংশটি
030

2
@ 030 আমি একটি উদাহরণ সেশনে যুক্ত করেছি যা বাস্তবে কার্যপ্রবাহের মতো দেখতে চিত্রিত করে session
আইগাল

7

স্কোপিও নামে একটি সরঞ্জাম রয়েছে যা একটি সংগ্রহশালা থেকে ডকারের চিত্রগুলি পুনরুদ্ধার করতে এবং এগুলি বেশ কয়েকটি ফর্ম্যাটে সংরক্ষণ করতে পারে।

উদাহরণ স্বরূপ:

  1. চিত্রটি ডাউনলোড করুন এবং স্তরগুলি তারবাল হিসাবে সংরক্ষণ করুন: skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu

  2. /tmp/ubuntu.tarইচ্ছা করলে অন্য মেশিনে স্থানান্তর করুন ।

  3. ছবিটি কোনও ডকার উদাহরণে লোড করুন যার ইন্টারনেট সংযোগ নেই: docker load --input /tmp/ubuntu.tar

এটি প্যাকেজের নামের সাথে সেন্টোস 7 রেপোতে উপলব্ধ skopeo। এই মুহূর্তে কোনও ডেবিয়ান বা উবুন্টু প্যাকেজ নেই (তবে এটি সংকলন করা সহজ)।


3

অনুপ্রেরণার জন্য ধন্যবাদ আমি এর একটি পাওয়ারশেল সংস্করণ তৈরি করেছি। এটি পরীক্ষা করে দেখুন ... এটির সাহায্যে আপনি মূল বা প্রশাসকের অধিকার ছাড়াই উইন্ডোজ ডেস্কটপ এবং একটি এসএসসি-স্কিপ সরঞ্জাম সহ একটি সীমাবদ্ধ ডকার নেটওয়ার্কগুলিতে ডকারহব কনটেইনারগুলিতে সরিয়ে নিতে পারেন machine

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

আমার কাছে এটি সম্পূর্ণরূপে পরিষ্কার নয় যে আপনি কী অর্জন করতে চাইছেন এবং কেন চেষ্টাগুলি সমস্যার সমাধান নয়। যদি আমি এই সমস্যাটি সমাধান করতে চাই তবে আমি @ টেনসিবাই এবং অন্যান্য প্রশ্নোত্তর পছন্দ করতে চাই, ইন্টারনেট সংযোগ সহ কোনও সিস্টেমে প্রথমে কোনও ডকার টানুন, ডকার চিত্রটি সংরক্ষণ করুন, ইন্টারনেট সংযোগ ছাড়াই মেশিনে এটি অনুলিপি করুন, চিত্রটি লোড করুন এবং এটি চালান ।

প্রদর্শন

সিস্টেম এ তে কোনও চিত্র নেই:

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

ডকার চিত্র সংরক্ষণ করুন:

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

সিস্টেমবিতে ডকার চিত্রটি অনুলিপি করুন এবং এটি লোড করুন।

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
ইন্টারনেট সংযোগ সহ মেশিনটি ডকার ইনস্টল করে না এবং থাকতে পারে না। প্রশ্নটি ডকার ক্লায়েন্টটি ব্যবহার না করেই একটি চিত্র ডাউনলোড করার উপায় জিজ্ঞাসা করছে । আমার সমাধান দেখুন ।
igal

0

এখানে একটি অভিযোজিত পাইথন স্ক্রিপ্ট রয়েছে, এটির একটি ওএস স্বতন্ত্র সমাধান রয়েছে: ডকার-ড্রাগ drag

এটি এর মতো ব্যবহার করুন এবং এটি একটি টিআরআরআর্কাইজ তৈরি করবে যা আপনি ডকার লোড ব্যবহার করে আমদানি করতে সক্ষম হবেন:

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 লাইন দীর্ঘ এবং এটি পড়তে পারা যায় বলে আমি মনে করি না। তবুও, আপনি স্ক্রিপ্টের নিজস্ব অনুলিপি সংরক্ষণ করতে কোডটি কাঁটাচামচ করতে পারেন।
দুতফাজ

এটি আমার পক্ষে নয়, এটির একটি উত্তর যা স্বনির্ভর হয়, যদি লিঙ্কটি বিরতি হয় তবে আপনি কি সত্যিই ভাবেন যে এটি কয়েক মাসের মধ্যে এই উত্তরটি পড়তে কাউকে সহায়তা করতে পারে? (বিটিডব্লিউর উত্তরের সর্বাধিক আকার 30 ক অক্ষর)
তেনসিবাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.