ฉันต้องการดาวน์โหลด Docker Image จากDocker Hubด้วยตนเอง โดยเฉพาะอย่างยิ่งฉันต้องการดาวน์โหลดภาพ Docker จาก Docker Hub บนเครื่องในสภาพแวดล้อมที่ จำกัด ซึ่งไม่มี (และไม่สามารถ) ติดตั้งซอฟต์แวร์ไคลเอ็นต์ Docker ได้ ฉันคิดว่าอาจเป็นไปได้ที่จะใช้API อย่างเป็นทางการแต่นี่ไม่ใช่กรณี - ดูการสนทนาต่อไปนี้:
เป็นจริงหรือไม่ที่ API ไม่รองรับการดาวน์โหลดภาพ? มีวิธีแก้ไขไหม
อัปเดต 1:
ฉันเจอโพสต์ ServerFault ต่อไปนี้:
โซลูชั่นที่ได้รับการยอมรับใช้docker save
คำสั่งซึ่งไม่ได้ช่วยในสถานการณ์ของฉัน แต่โซลูชันอื่นที่โพสต์มีอ้างอิงโพสต์ StackOverflow ต่อไปนี้:
หนึ่งในวิธีแก้ปัญหานั้นอ้างถึงเครื่องมือบรรทัดคำสั่งที่เรียกว่าdocker-registry-debugซึ่งสามารถสร้าง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:
ดูเหมือนว่าฉันสามารถดาวน์โหลดเลเยอร์ blobs จาก Docker Hub นี่คือสิ่งที่ฉันกำลังทำอยู่
รับโทเค็นการอนุญาต:
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"
เขียนผลรวมของ blob ทั้งหมดลงในไฟล์:
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
ดาวน์โหลดเลเยอร์ blobs ทั้งหมดจากไฟล์ Manifest:
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
ตอนนี้ฉันมีเลเยอร์ blobs หลายชั้นและฉันจำเป็นต้องรวมภาพเหล่านั้นกลับเป็นรูปภาพ - ฉันคิดว่า
ลิงก์ที่เกี่ยวข้อง:
ฟอรัม Community Docker: ดาวน์โหลดอิมเมจ Docker Hub แบบแมนนวล
ปัญหานักเทียบท่า # 1016: ดึงภาพนักเทียบท่าโดยไม่มีคำสั่งนักเทียบท่า เช่นกับ wget
ServerFault: การดาวน์โหลดอิมเมจ docker สำหรับการถ่ายโอนไปยังเครื่องที่ไม่ได้เชื่อมต่ออินเทอร์เน็ต
StackOverflow: การดาวน์โหลดอิมเมจ docker สำหรับถ่ายโอนไปยังเครื่องที่ไม่ได้เชื่อมต่ออินเทอร์เน็ต
StackOverflow: วิธีดาวน์โหลดอิมเมจ docker โดยไม่ใช้คำสั่ง pull
StackOverflow: URL ทางการของรีจิสทรี Docker Hub (Docker Hub)