Cách lấy danh sách hình ảnh trên docker registry v2


203

Tôi đang sử dụng docker registry v1 và tôi muốn chuyển sang phiên bản mới hơn, v2. Nhưng tôi cần một số cách để có được một danh sách các hình ảnh có trong sổ đăng ký; ví dụ với registry v1 tôi có thể thực hiện yêu cầu GET http://myregistry:5000/v1/search?và kết quả là:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

Nhưng tôi không thể tìm thấy trên tài liệu chính thức một cái gì đó tương tự để có được một danh sách hình ảnh trên sổ đăng ký. Bất cứ ai cũng biết một cách để làm điều đó trên phiên bản mới v2?


Vẫn không đủ. Cần ngày tạo hình ảnh và đẩy hình ảnh, và hy vọng bao gồm / loại bỏ các phiên bản thẻ trước. Cũng phải có một giao diện web thực sự, phải không? Tôi đang nói chuyện với quản trị viên của mình - chúng tôi chỉ có 2.0
Andrew Wolfe

Câu trả lời:


404

Đối với phiên bản mới nhất (kể từ 2015-07-31) của Registry V2, bạn có thể lấy hình ảnh này từ DockerHub:

docker pull distribution/registry:master

Liệt kê tất cả các kho lưu trữ (hình ảnh hiệu quả):

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

Liệt kê tất cả các thẻ cho một kho lưu trữ:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}

3
Bạn lấy chứng chỉ từ đâu?
duality_

3
@duality trong trường hợp đăng ký của bạn đang sử dụng chứng chỉ tự ký hoặc chứng chỉ được ký bởi CA gốc không đáng tin cậy, bạn cần cung cấp chứng chỉ để cuộn lại để thiết lập kết nối an toàn. Để tạo kết nối không an toàn, bạn có thể thêm cờ '- không an toàn'.
jonatan

5
-k, - bảo mật (SSL)
Ilja

9
Kết quả mặc định chỉ hiển thị 100 bản ghi hình ảnh, nhưng nếu bạn cần hiển thị nhiều hơn, bạn có thể phân trang kết quả với truy vấn này: http://<registry-url>/v2/_catalog?n=<count>với số lượng ví dụ 2000.
kikicarbonell

17
Nếu sổ đăng ký được bảo vệ bằng mật khẩu, hãy sử dụngcurl -u <user>:<pass> -X GET ...
nsantos

77

bạn có thể tìm kiếm trên

http: // <ip/hostname>: <port>/ v2 / _catalog


4
... gần đây tôi chỉ muốn thêm rằng https là bắt buộc thay vì chỉ http
Nikola

2
Tôi thấy không có nhu cầu như vậy cho Docker Registry được cài đặt gần đây của tôi!
Enok82

42

Nhận danh mục

Mặc định, đăng ký api trả lại 100 mục của danh mục, có :

Khi bạn cuộn tròn api đăng ký:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

nó tương đương với

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

Đây là một methond phân trang.

Khi tổng số mục vượt quá 100, bạn có thể thực hiện theo hai cách:

Đầu tiên : đưa ra một số lượng lớn hơn

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond : phân tích url liên kết tiếp theo

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

Một yếu tố liên kết có trong tiêu đề phản hồi:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

tiêu đề phản hồi:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

Phần tử liên kết có mục cuối cùng của yêu cầu này, sau đó bạn có thể yêu cầu 'trang' tiếp theo:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

Nếu tiêu đề phản hồi chứa thành phần liên kết , bạn có thể thực hiện nó trong một vòng lặp .

Nhận hình ảnh

Khi bạn nhận được kết quả của danh mục, nó như sau:

{ "repositories": [ "busybox", "ceph/mds" ] }

bạn có thể lấy hình ảnh trong mỗi danh mục:

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

trả về:

{"name":"busybox","tags":["latest"]}


1
100 mục được xác định tại đây
litanhua

2
Đây phải là câu trả lời được chấp nhận. Đó là câu trả lời duy nhất giải thích cách bạn đi xung quanh việc phân trang đáng sợ. Câu trả lời hiện được chấp nhận (jonatan) chỉ hiển thị hình ảnh bắt đầu bằng "a".
user2394284

và làm thế nào bạn có được danh sách thẻ cho ceph/mds? nói chung, đối với bất kỳ kho lưu trữ nào được xác định bằng /- /v2/_catalog/ceph/mdt/tags/listkhông hoạt động
tymik


21

Chúng tôi đã viết một công cụ CLI cho mục đích này: docker-ls Nó cho phép bạn duyệt một sổ đăng ký docker và hỗ trợ xác thực thông qua mã thông báo hoặc xác thực cơ bản.


21

Điều này đã khiến tôi phát điên, nhưng cuối cùng tôi đã ghép tất cả các mảnh lại với nhau. Kể từ ngày 1/25/2015, tôi đã xác nhận rằng có thể liệt kê các hình ảnh trong sổ đăng ký docker V2 (chính xác như @jonatan đã đề cập ở trên.)

Tôi sẽ bỏ phiếu cho câu trả lời đó, nếu tôi có đại diện cho nó.

Thay vào đó, tôi sẽ mở rộng câu trả lời. Vì đăng ký V2 được thực hiện với mục đích bảo mật, tôi nghĩ rằng nó phù hợp để bao gồm cách thiết lập nó với một chứng chỉ tự kýchạy container với chứng chỉ đó để có thể thực hiện cuộc gọi https với chứng chỉ đó:

Đây là kịch bản tôi thực sự sử dụng để bắt đầu đăng ký:

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

Điều này có thể rõ ràng với một số người, nhưng tôi luôn bị lẫn lộn với các phím và certs. Tệp cần được tham chiếu để thực hiện cuộc gọi @jonaton đề cập ở trên **, là domain.crt được liệt kê ở trên. (Vì tôi đã đặt domain.crt /root, tôi đã tạo một bản sao vào thư mục người dùng nơi có thể truy cập được.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

** Lệnh trên đã được thay đổi: -X GET không thực sự hoạt động khi tôi thử.

Lưu ý: https://myregistry:5000(như trên) phải khớp với tên miền được cung cấp cho chứng chỉ được tạo.



7

Dưới đây là một lớp lót nhỏ xinh (sử dụng JQ) để in ra danh sách Repos và các thẻ liên quan.

Nếu bạn chưa jqcài đặt, bạn có thể sử dụng:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list

argh, tôi vừa viết bài này sau đó tìm thấy bạn: S nhưng tôi sẽ giữ câu trả lời của mình vì nó cũng chỉ ra cách xử lý Auth cơ bản, và nó giải thích tại sao nó hoạt động. Cũng lọc kết quả vào một danh sách hình ảnh phẳng.
Craig Ringer

Chỉ trong trường hợp jq không có trong bản phân phối Linux của bạn, hãy lấy nó stedolan.github.io/jq/d Download Đây là một công cụ nhỏ rất hữu ích.
ISQ

5

Tôi đã phải làm tương tự ở đây và các công việc trên trừ khi tôi phải cung cấp chi tiết đăng nhập vì đây là kho lưu trữ docker cục bộ.

Theo như trên nhưng với việc cung cấp tên người dùng / mật khẩu trong URL.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

Nó trở lại dưới dạng JSON chưa được định dạng.

Tôi đã dẫn nó qua bộ định dạng python để dễ đọc cho con người, trong trường hợp bạn muốn có nó ở định dạng này.

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool

4

Sử dụng điểm cuối "/ v2 / _catalog" và "/ tags / list", bạn thực sự không thể liệt kê tất cả các hình ảnh. Nếu bạn đã đẩy một vài hình ảnh khác nhau và gắn thẻ chúng là "mới nhất", bạn thực sự không thể liệt kê những hình ảnh cũ! Bạn vẫn có thể kéo chúng nếu bạn tham khảo chúng bằng cách sử dụng "docker pull ub Ubuntu @ sha256: ac13c5d2 ...". Vì vậy, câu trả lời là - không có cách nào để liệt kê hình ảnh mà bạn chỉ có thể liệt kê các thẻ không giống nhau


3

Nếu một số trên nhận được điều này đến nay.

Lấy những gì người khác đã nói ở trên. Đây là một lớp lót đặt câu trả lời vào một tệp văn bản được định dạng, json.

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

Trông giống như

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

Bạn có thể cần thay đổi `? N = xxxx 'để khớp với số lượng container bạn có.

Tiếp theo là một cách để tự động loại bỏ các container cũ và không sử dụng.


2

Docker tìm kiếm chức năng đăng ký v2 hiện không được hỗ trợ tại thời điểm viết bài này. Xem thảo luận kể từ tháng 2 năm 2015: "đề xuất chức năng tìm kiếm đăng ký # 206" https://github.com/docker/distribution/issues/206

Tôi đã viết một tập lệnh mà bạn có thể tìm thấy: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 Nó không đẹp nhưng nó có được thông tin cần thiết từ sổ đăng ký riêng.


2

Tôi đã viết một công cụ dòng lệnh dễ sử dụng để liệt kê hình ảnh theo nhiều cách khác nhau (như liệt kê tất cả hình ảnh, liệt kê tất cả các thẻ của những hình ảnh đó, liệt kê tất cả các lớp của các thẻ đó).

Nó cũng cho phép bạn xóa các hình ảnh không sử dụng theo nhiều cách khác nhau, như chỉ xóa các thẻ cũ hơn của một hình ảnh hoặc từ tất cả các hình ảnh, v.v ... Điều này thuận tiện khi bạn điền vào sổ đăng ký của mình từ máy chủ CI và chỉ muốn giữ các phiên bản mới nhất / ổn định.

Nó được viết bằng python và không cần bạn tải xuống những hình ảnh đăng ký tùy chỉnh lớn cồng kềnh.


2

Dưới đây là một ví dụ liệt kê tất cả các thẻ của tất cả các hình ảnh trên sổ đăng ký. Nó cũng xử lý một sổ đăng ký được cấu hình cho HTTP Basic auth.

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

Giải trình:

  • trích xuất tên người dùng: mật khẩu từ .docker / config.json
  • thực hiện một yêu cầu https đến cơ quan đăng ký để liệt kê tất cả "kho"
  • lọc kết quả json thành một danh sách phẳng các tên kho lưu trữ
  • cho mỗi tên kho lưu trữ:
  • tạo một yêu cầu https đến cơ quan đăng ký để liệt kê tất cả "thẻ" cho "kho lưu trữ" đó
  • lọc luồng các đối tượng json kết quả, in các cặp "repository": "tag" cho mỗi thẻ được tìm thấy trong mỗi kho lưu trữ

1

Chủ đề này có từ rất lâu, các công cụ gần đây nhất mà người ta nên xem xét là skopeocrane.

skopeohỗ trợ ký và có nhiều tính năng khác, trong khi cranetối giản hơn một chút và tôi thấy việc tích hợp với tập lệnh shell đơn giản dễ dàng hơn.


0

Vì mỗi sổ đăng ký chạy như một container, ID container có tệp nhật ký được liên kết ID-json.log, tệp nhật ký này chứa vars.name = [image] và vars.reference = [tag]. Một tập lệnh có thể được sử dụng để ngoại suy và in chúng. Đây có lẽ là một phương pháp để liệt kê các hình ảnh được đẩy lên registry V2-2.0.1.

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.