2017-01-23 21 views
7

Với thẻ 'mới nhất`, chúng tôi muốn tìm một thẻ khác có cùng ID hình ảnh trên Docker Hub.Làm cách nào để xác định ID hình ảnh Docker cho thẻ thông qua API Hub Docker?

Sau đây là cách để tìm hiểu tất cả các thẻ cho một repo với Docker Hub API v2:

TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token) 
curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/fluent/fluentd/tags/?page_size=100 | jq 

(Xem gist.github.com/kizbitz)

Thật không may, nó không chứa ID hình ảnh nhưng luôn luôn là một Giá trị `null` cho khóa này:

$ curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/fluent/fluentd/tags/?page_size=100 | jq 
{ 
    "count": 36, 
    "next": null, 
    "previous": null, 
    "results": [ 
... 
    { 
     "name": "v0.14.11", 
     "full_size": 11964464, 
     "id": 7084687, 
     "repository": 219785, 
     "creator": 2923, 
     "last_updater": 2923, 
     "last_updated": "2016-12-27T07:16:41.294807Z", 
     "image_id": null, 
     "v2": true, 
     "platforms": [ 
     5 
     ] 
    }, 
... 

Thật không may, ID hình ảnh khác với 'id` trong JSON ở trên.

$ docker images | grep fluent 
docker.io/fluent/fluentd     v0.14.11   1441d57beff9  3 weeks ago   38.25 MB 

Về mặt lý thuyết, chúng ta có thể truy cập vào Manifests Docker và cùng với các hình ảnh ID với cuộc gọi Docker Registry này nhưng nó không giúp được gì:

$ curl -s -H "Authorization: JWT ${TOKEN}" "https://registry.hub.docker.com/v2/fluent/fluentd/manifests/latest" 
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Name":"fluent/fluentd","Action":"pull"}]}]} 

(Xem stackoverflow.com)

Đây là sự cố tương tự trong trình gỡ lỗi GitHub của Docker nhưng tôi vẫn không thể tìm ra giải pháp: https://github.com/docker/distribution/issues/1490.

P.S .: Dưới đây là phiên bản Docker của tôi mà tôi đã cố gắng để đẩy một hình ảnh kiểm tra:

$ docker version 
Client: 
Version:   1.12.6 
API version:  1.24 
Package version: docker-common-1.12.6-5.git037a2f5.fc25.x86_64 
Go version:  go1.7.4 
Git commit:  037a2f5/1.12.6 
Built:   Wed Jan 18 12:11:29 2017 
OS/Arch:   linux/amd64 

Trả lời

9

Docker Registry API v2 sử dụng hình ảnh tiêu hóa thay vì ID hình ảnh để phân biệt bản sắc hình ảnh.

Hình ảnh tiêu hóa có thể được lấy từ Docker-Content-Digest của tiêu đề phản ứng HTTP bằng cách thực hiện cuộc gọi API sau:

$ REPOSITORY=fluent/fluentd 

$ TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull" | jq -r .token) 

$ curl -s -D - -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://index.docker.io/v2/$REPOSITORY/manifests/latest 
HTTP/1.1 200 OK 
Content-Length: 1982 
Content-Type: application/vnd.docker.distribution.manifest.v2+json 
Docker-Content-Digest: sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db 
Docker-Distribution-Api-Version: registry/2.0 
Etag: "sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db" 
Date: Tue, 24 Jan 2017 13:34:53 GMT 
Strict-Transport-Security: max-age=31536000 
... 

Tất cả các thẻ có thể thu được với các cuộc gọi API sau:

$ curl -s -H "Authorization: Bearer $TOKEN" https://index.docker.io/v2/$REPOSITORY/tags/list 
{"name":"fluent/fluentd","tags":["edge-onbuild","edge","jemalloc","latest-onbuild","latest","onbuild","stable-onbuild","stable","ubuntu-base","v0.12-latest-onbuild","v0.12-latest","v0.12-onbuild","v0.12.16","v0.12.18","v0.12.19","v0.12.20","v0.12.21","v0.12.23","v0.12.24","v0.12.26-2","v0.12.26-onbuild","v0.12.26","v0.12.27-onbuild","v0.12.27","v0.12.28-onbuild","v0.12.28","v0.12.29-onbuild","v0.12.29","v0.12.30-onbuild","v0.12.30","v0.12.31-onbuild","v0.12.31","v0.12","v0.14-latest-onbuild","v0.14-latest","v0.14-onbuild","v0.14.1","v0.14.10-onbuild","v0.14.10","v0.14.11-onbuild","v0.14.11","v0.14.2","v0.14.6","v0.14.8","v0.14"]} 

Dựa ở trên, để tìm cùng một thông báo như một thẻ cụ thể, nó sẽ là một tập lệnh như sau.

#!/bin/bash 

REPOSITORY=$1 
TARGET_TAG=$2 

# get authorization token 
TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull" | jq -r .token) 

# find all tags 
ALL_TAGS=$(curl -s -H "Authorization: Bearer $TOKEN" https://index.docker.io/v2/$REPOSITORY/tags/list | jq -r .tags[]) 

# get image digest for target 
TARGET_DIGEST=$(curl -s -D - -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://index.docker.io/v2/$REPOSITORY/manifests/$TARGET_TAG | grep Docker-Content-Digest | cut -d ' ' -f 2) 

# for each tags 
for tag in ${ALL_TAGS[@]}; do 
    # get image digest 
    digest=$(curl -s -D - -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://index.docker.io/v2/$REPOSITORY/manifests/$tag | grep Docker-Content-Digest | cut -d ' ' -f 2) 

    # check digest 
    if [[ $TARGET_DIGEST = $digest ]]; then 
    echo "$tag $digest" 
    fi 
done 

Kết quả là như sau:

$ ./find_same_digest.sh fluent/fluentd latest 
latest sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db 
stable sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db 
v0.12.31 sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db 
v0.12 sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db 

Nếu bạn muốn kiểm tra tiêu hóa của hình ảnh địa phương, bạn có thể lấy nó với docker images --digests:

$ docker images --digests | grep fluentd 
fluent/fluentd     latest    sha256:eaea1edffc34cff3b5e31ee738ea56e46326f90731b4139a19948814a4f0a4db 1788ee7dcfcc  14 hours ago  35.41 MB 
+0

lưu ý nhỏ, vì bạn chỉ muốn các tiêu đề sử dụng 'curl -I' để làm một HEAD HTTP. Ngoài ra, '-i' cũng giống như' -D -'. –

1

Câu trả lời ở trên là tuyệt quá! Ngoài ra, nếu bạn muốn sử dụng này trên một repo tin, bạn cần phải thêm auth cơ bản với thông tin người dùng đăng ký của bạn, và 'tài khoản =' tham số phạm vi thêm

(xem http://www.cakesolutions.net/teamblogs/docker-registry-api-calls-as-an-authenticated-user)

+2

'curl -u $ UNAME: $ UPASS" https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPOSITORY:pull&account=$UNAME "' – Janux

Các vấn đề liên quan