Подобно вопросу «Что такое код sha256 образа докера? ", я бы хотел найти дайджест образа Docker. Я вижу дайджест, когда скачиваю изображение:

$ docker pull waisbrot/wait:latest                                                                                                  
latest: Pulling from waisbrot/wait
Digest: sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
Status: Image is up to date for waisbrot/wait:latest
$

Другой вопрос, Что такое конечная точка API реестра Docker v2 для получения дайджеста изображения? есть ответ, предлагающий заголовок Docker-Content-Digest.

Когда я получаю манифест изображения, я вижу, что есть заголовок Docker-Content-Digest:

$ curl 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:waisbrot/wait:pull' -H "Authorization: Basic ${username_password_base64}"

# store the resulting token in DT

$ curl -v https://registry-1.docker.io/v2/waisbrot/wait/manifests/latest -H "Authorization: Bearer $DT" -XHEAD
*   Trying 52.7.141.30...
* Connected to registry-1.docker.io (52.7.141.30) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.docker.io
* Server certificate: RapidSSL SHA256 CA - G3
* Server certificate: GeoTrust Global CA
> GET /v2/waisbrot/wait/manifests/latest HTTP/1.1
> Host: registry-1.docker.io
> User-Agent: curl/7.43.0
> Accept: */*
> Authorization: Bearer LtVRw-etc-etc-etc
>
< HTTP/1.1 200 OK
< Content-Length: 4974
< Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws
< Docker-Content-Digest: sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3
< Docker-Distribution-Api-Version: registry/2.0
< Etag: "sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3"
< Date: Wed, 07 Sep 2016 16:37:15 GMT
< Strict-Transport-Security: max-age=31536000

Однако этот заголовок не тот. Команда pull достала мне 6f21, а заголовок показывает 128c. Кроме того, для этого дайджеста команда pull не работает:

$ docker pull waisbrot/wait@sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3                               
Error response from daemon: manifest unknown: manifest unknown

Тогда как все работает так, как я хочу, когда у меня есть правильный дайджест:

$ docker pull waisbrot/wait@sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330                                 12:46  waisbrot@influenza
sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330: Pulling from waisbrot/wait
Digest: sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
Status: Image is up to date for waisbrot/wait@sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330

Я ищу способ перевести тег latest (который постоянно меняется) в фиксированный дайджест, который я могу надежно извлечь. Но на самом деле я не хочу снимать его, чтобы сделать этот перевод.

14
Nathaniel Waisbrot 7 Сен 2016 в 19:48

6 ответов

Лучший ответ

Для более новых версий Docker команда inspect предоставляет правильное значение:

docker inspect --format='{{index .RepoDigests 0}}' waisbrot/wait

Для более старых версий выберите значение из репозитория, следуя этому примеру с основным репозиторием Docker:

curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
     -H "Authorization: Basic ${username_password_base64}" \
     'https://auth.docker.io/token?service=registry.docker.io&scope=repository:waisbrot/wait:pull' 

Наивные попытки получить это значение терпят неудачу, потому что сервером по умолчанию выбирается тип содержимого application/vnd.docker.distribution.manifest.v1+prettyjws (манифест v1) и вам нужен манифест v2. Следовательно, вам необходимо установить заголовок Accept на application/vnd.docker.distribution.manifest.v2+json.

16
Nathaniel Waisbrot 9 Мар 2019 в 18:03

Недавно я столкнулся с задачей, требующей просмотра дайджеста sha256 без необходимости извлечения изображения. Инструмент skopeo выполняет вызовы API реестра, поэтому вам не нужно извлекать изображение.

Например,

$ skopeo inspect --creds "username:password" docker://waisbrot/wait:latest

Затем вы можете передать это по конвейеру jq, если хотите получить только дайджест-значение.

$ skopeo inspect --creds "username:password" \
  docker://waisbrot/wait:latest | jq -r '.Digest'
sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
1
wsams 16 Июл 2020 в 23:22

Я понимаю, что на эту проблему есть ответ, однако либо мне что-то не хватает, либо текущая версия службы реестра AWS ECR не работает должным образом.

При попытке получить дайджест из AWS ECR с использованием HEAD, а также при попытке переключить тип содержимого, не возвращается значение дайджеста, которое я могу использовать для получения изображения с помощью реестра Api.

Чтобы получить этот дайджест, вам необходимо получить манифест для интересующего вас тега и вычислить sha256 ответа Json как есть, включая форматирование, без раздела подписи .

0
Alexandre Thenorio 4 Окт 2016 в 21:57

Вы можете получить это, используя docker inspect:

docker inspect --format='{{index .RepoDigests 0}}' ${IMAGE_NAME}

Документы: https://docs.docker.com/engine/reference/commandline/inspect /

Это было как минимум с версии 1.9.

0
mcw 29 Янв 2019 в 14:29

Вы можете получить его с помощью 2 HTTP-запросов. Первый для получения токена аутентификации, а второй для получения списка дайджеста изображения по архитектуре и варианту:

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

curl -s --header "Accept: application/vnd.docker.distribution.manifest.list.v2+json" --header "Authorization: Bearer ${token}" "https://registry-1.docker.io/v2/$image/manifests/$tag" | jq -r '.manifests|.[]| "\(.digest) \(.platform.architecture) \(.platform.variant)"'

Пример с:

image=library/nginx
tag=stable-alpine
sha256:8853c7e938c2aa5d9d7439e698f0e700f058df8414a83134a09fcbb68bb0707a amd64 null
sha256:dbcd23f95b94018fe72bfdb356e40f4ae8b95063883f3456fedaed1c02204ed4 arm v6
sha256:d3670edcd50bb07cae303767426adf9bc7ba0219736148d30e6f30dd4e08695c arm v7
sha256:0bcd76faa141e4fa37e875834b3994261e0cfc94b7233ac84896381315b845ca arm64 v8
sha256:da8e62ddb3fab89ff4fa0271dbe230f849ab53402a71338503952437dcda1026 386 null
sha256:269bf99e100294b6b75fbdecf7b4ddbef8b29ea0a953e2e904452a50dbc923ab ppc64le null
sha256:103da50956034c157abeffbc869e2e38a4fabbf913bed8ae6ae7c59e646b28a1 s390x null
0
jfx 11 Июл 2020 в 13:16

Следуя предложению ByteFlinger, в котором не было примера, я попробовал это, и вот как его рассчитать:

$ docker-ls tag -registry https://myregistry.net:5000 
spicysomtam/zookeeper:latest
requesting manifest . done
repository: spicysomtam/zookeeper
tagName: latest
digest: sha256:bd5dd80253171e4dffccbea7c639c90a63d5424aa2d7fe655aea766405c83036

$ curl -ns -H "Accept: 
application/vnd.docker.distribution.manifest.v2+json" -X GET  
https://myregistry.net:5000/v2/spicysomtam/zookeeper/manifests/latest|sha256sum
bd5dd80253171e4dffccbea7c639c90a63d5424aa2d7fe655aea766405c83036  -

$ docker images --digests |grep zookeeper
myregistry.net:5000/spicysomtam/zookeeper           latest                                     sha256:bd5dd80253171e4dffccbea7c639c90a63d5424aa2d7fe655aea766405c83036   a983e71ca22d        29 hours ago        584MB
0
spicysomtam 13 Окт 2017 в 15:44