Tải xuống Docker Hình ảnh từ Docker Hub mà không cần sử dụng Docker


32

Tôi muốn tải xuống thủ công một hình ảnh Docker từ Docker Hub . Cụ thể hơn, tôi muốn tải xuống Docker Image từ Docker Hub trên máy trong môi trường hạn chế không cài đặt phần mềm máy khách Docker. Tôi đã nghĩ rằng điều này sẽ có thể sử dụng API chính thức , nhưng điều này dường như không xảy ra - xem cuộc thảo luận sau:

Có thực sự là trường hợp API không hỗ trợ tải xuống hình ảnh? Có cách nào để làm việc này?


CẬP NHẬT 1:

Tôi đã xem qua bài đăng ServerFault sau:

Các giải pháp được chấp nhận sử dụng các docker savelệnh, mà không giúp gì trong hoàn cảnh của tôi. Nhưng một giải pháp khác được đăng ở đó trích dẫn bài đăng StackOverflow sau đây:

Một trong những giải pháp ở đó đề cập đến một công cụ dòng lệnh gọi là docker-registry-debug , trong số những thứ khác, có thể tạo ra một curllệnh để tải xuống một hình ảnh. Đây là những gì tôi nhận được:

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

Thật không may, có vẻ như curllệnh được tạo ra không hoạt động.


CẬP NHẬT 2:

Có vẻ như tôi có thể tải xuống các đốm màu từ Docker Hub. Đây là cách tôi đang diễn ra về nó.

Nhận mã thông báo ủy quyề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' \
)"

Kéo một bảng kê khai hình ảnh:

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

Kéo một bảng kê khai hình ảnh và trích xuất các khoản tiền 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'

sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
sha256:be588e74bd348ce48bb7161350f4b9d783c331f37a853a80b0b4abc0a33c569e
sha256:e4ce6c3651b3a090bb43688f512f687ea6e3e533132bcbc4a83fb97e7046cea3
sha256:421e436b5f80d876128b74139531693be9b4e59e4f1081c9a3c379c95094e375
sha256:4c7380416e7816a5ab1f840482c9c3ca8de58c6f3ee7f95e55ad299abbfe599f
sha256:660c48dd555dcbfdfe19c80a30f557ac57a15f595250e67bfad1e5663c1725bb

Tải xuống một blob một lớp và ghi nó vào một tệp:

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"

Viết tất cả các khoản tiền blob vào một tập tin:

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

Tải xuống tất cả các đốm màu từ bảng kê khai:

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

Bây giờ tôi có một loạt các đốm màu và tôi cần kết hợp lại chúng thành một hình ảnh - tôi nghĩ vậy.


Liên kết liên quan:


"Cụ thể hơn, tôi muốn tải xuống Docker Image từ Docker Hub trên máy trong một môi trường hạn chế không cài đặt phần mềm máy khách Docker." => Điểm nào có hình ảnh trên máy này? (workaround dễ dàng hơn là sử dụng một loạt trục, một trong những nơi bạn ACN Docker kéo từ dockerhub và Docker tiết kiệm / đẩy Docker một registry nội bộ sau)
Tensibai

@Tensibai Để sao chép nó vào một máy tính mà không có Docker nhưng không có quyền truy cập internet.
igal

Bạn đã có một cái nhìn vào mã kéo docker? Nghe có vẻ là cách để xây dựng một cái gì đó như thế này từ các cuộc gọi http cơ bản
Tensibai

@Tensibai Tôi nghĩ rằng tôi đã tìm ra nó. Tôi cũng nghĩ rằng tôi đã có một giải pháp từ cộng đồng Docker. Tôi sẽ trở lại và đăng giải pháp sau ngày hôm nay.
igal

@Tensibai Tôi đã đăng một giải pháp với một kịch bản shell để giải quyết vấn đề.
igal

Câu trả lời:


23

Vì vậy, hóa ra Dự án Moby có tập lệnh shell trên Moby Github có thể tải xuống hình ảnh từ Docker Hub theo định dạng có thể được nhập vào Docker:

Cú pháp sử dụng cho tập lệnh được đưa ra bởi:

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

Hình ảnh sau đó có thể được nhập với tardocker load:

tar -cC 'target_dir' . | docker load

Để xác minh rằng tập lệnh hoạt động như mong đợi, tôi đã tải xuống một hình ảnh Ubuntu từ Docker Hub và tải nó vào Docker:

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

Trên thực tế tôi sẽ phải đầu tiên sao chép dữ liệu từ khách hàng internet (mà không có Docker cài đặt) với mục tiêu / máy đích (mà không có Docker cài đặt):

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

và sau đó tải và sử dụng hình ảnh trên máy chủ đích:

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. nhưng bạn áp dụngdocker load
030

@ 030 Chỉ để kiểm tra / chứng minh rằng tập lệnh hoạt động và dữ liệu hình ảnh tải xuống có thể được nhập vào Docker. Trong thực tế, trước tiên tôi sẽ phải sao chép dữ liệu vào một máy đã cài đặt Docker.
igal

Có lẽ bạn có thể thêm phần đó để làm rõ
030

2
@ 030 Tôi đã thêm một phiên ví dụ minh họa quy trình công việc sẽ như thế nào trong thực tế.
igal

7

Có một công cụ gọi là Skopeo có thể truy xuất hình ảnh Docker từ kho lưu trữ và lưu chúng ở một số định dạng.

Ví dụ:

  1. Tải xuống hình ảnh và lưu các lớp dưới dạng tarball: skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu

  2. Chuyển /tmp/ubuntu.tarsang máy khác nếu muốn.

  3. Tải hình ảnh trên một ví dụ Docker không có kết nối internet: docker load --input /tmp/ubuntu.tar

Nó có sẵn trong repo CentOS 7 với tên gói skopeo. Không có gói Debian hoặc Ubuntu tại thời điểm này (nhưng nó rất dễ biên dịch).


3

cảm ơn vì động lực. Tôi đã tạo ra một phiên bản powershell của nó. Hãy xem thử ... Với nó, bạn có thể di chuyển trong các thùng chứa dockerhub sang các mạng docker bị hạn chế với máy tính để bàn windows và công cụ ssh-scp đến máy docker mà không cần quyền root hoặc quản trị viên

https://gitlab.com/Jancsoj78/dockerless_docker_doader một công cụ hacker mới :)

$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

Đối với tôi nó không hoàn toàn rõ ràng những gì bạn đang cố gắng để đạt được và tại sao những nỗ lực không phải là một giải pháp cho vấn đề. Nếu tôi cần giải quyết vấn đề này, tôi muốn @Tensibai và các câu hỏi và trả lời khác được chỉ định, trước tiên hãy thực hiện một docker trên hệ thống có kết nối internet, lưu hình ảnh docker, sao chép nó vào máy mà không cần kết nối internet, tải hình ảnh và chạy nó .

Trình diễn

Không có hình ảnh trên hệ thống A:

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

Kéo một hình ảnh từ dockerhub:

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

Lưu hình ảnh docker:

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

Sao chép hình ảnh docker vào systemB và tải nó.

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
Máy có kết nối internet không và không thể cài đặt Docker. Câu hỏi là yêu cầu một cách để tải xuống một hình ảnh mà không cần sử dụng máy khách Docker. Xem giải pháp của tôi .
igal

0

Đây là một kịch bản python được điều chỉnh, do đó có một giải pháp độc lập cho hệ điều hành: kéo docker

Sử dụng nó như thế và nó sẽ tạo ra một kho lưu trữ TAR mà bạn sẽ có thể nhập bằng cách sử dụng tải docker:

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

1
Nếu bạn đóng tài khoản github của mình thì không còn gì, nếu bạn đồng ý chia sẻ nó, hãy giữ liên kết nhưng cũng dán đoạn mã vào đây. Bạn có thể chỉnh sửa câu trả lời của mình, dán mã của mình và sau đó chọn nó và nhập ctrl + K hoặc nút {}(mã) trong thanh trên cùng của trình chỉnh sửa để định dạng mã.
Tensibai

Tôi rất thích dán mã ở đây nhưng nó dài 100 dòng và tôi không nghĩ nó sẽ có thể đọc được. Tuy nhiên, bạn có thể rẽ nhánh mã để lưu bản sao của tập lệnh.
Dutfaz

Đó không phải là cho tôi, rằng để có một câu trả lời tự duy trì, nếu liên kết bị đứt, bạn có thực sự nghĩ rằng điều này có thể giúp ai đó đọc câu trả lời này trong một vài tháng không? (btw kích thước tối đa cho một câu trả lời là 30k ký tự)
Tensibai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.