2017-01-23 2 views
7

Учитывая тег `last`, мы хотим узнать другой тег с тем же идентификатором изображения на Docker Hub.Как определить идентификатор изображения Docker для тега через API-интерфейс Docker?

Вот как узнать все теги репо с API v2 Docker Hub:

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 

(См gist.github.com/kizbitz)

К сожалению, он не содержит идентификатор изображения, но всегда есть `null` значение этого ключа:

$ 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 
     ] 
    }, 
... 

к сожалению, изображение ID нечто иное, чем` id` в вышеуказанном формате JSON.

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

Теоретически, это должно быть возможно получить доступ к Docker манифестов и вместе с образом ID с этим вызовом Docker реестра, но это не помогло:

$ 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"}]}]} 

(см stackoverflow.com)

Вот аналогичная проблема в репозитории Docker GitHub, но я до сих пор не могу найти решение: https://github.com/docker/distribution/issues/1490.

P.S .: Вот мой Docker версия, с которой я пытался нажать тестовое изображение:

$ 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 

ответ

9

Docker Registry API v2 использует изображение переваривать вместо изображения ID различать идентичность изображения.

Изображение гидролизат может быть получен из Docker-Content-Digest заголовка ответа HTTP, сделав следующий API вызов:

$ 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 
... 

Все метки могут быть получены с помощью следующего вызова API:

$ 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"]} 

Based на вышесказанном, чтобы найти тот же дайджест, что и конкретный тег, это будет скрипт, как показано ниже.

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

Результат выглядит следующим образом:

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

Если вы хотите проверить дайджеста локального изображения, вы можете получить его с docker images --digests:

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

минорной ноты, так как вы хотите, чтобы заголовки использовали 'curl -I', чтобы делать HTTP HEAD. Кроме того, '-i' делает то же самое, что и' -D''. –

1

выше ответ Великий! Кроме того, если вы хотите использовать это на частный репо, необходимо добавить базовую авторизацию с учетными данными реестра, и «счета =» дополнительный параметр Scope

(см 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