Де я можу знайти код sha256 зображення докера?


91

Я хотів би витягнути зображення centos, tomcat, ... використовуючи їх код sha256, як у

docker pull myimage@sha256:0ecb2ad60

але я не можу знайти код sha256 для використання де завгодно.

Я перевірив сховище dockerhub на наявність будь-яких натяків на код sha256, але не зміг знайти жодного. Я завантажив зображення за їхнім тегом

docker pull tomcat:7-jre8

і перевірив зображення, docker inspectщоб побачити, чи є в метаданих код sha256, але його немає (додавання коду sha256 зображення, ймовірно, змінить код sha256).

Чи повинен я сам обчислювати код зображення sha256 і використовувати його?


1
Я створив випуск на dockerhub, пов’язаний із цим - github.com/docker/docker/issues/17670
Майкл Бартон,

Відповіді:


89

Остання відповідь

Редагування, запропоноване OhJeez у коментарях.

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

Оригінальна відповідь

Я вірю, що ви також можете отримати це за допомогою

docker inspect --format='{{.RepoDigests}}' $IMAGE

Працює лише в Docker 1.9, і якщо зображення спочатку було витягнуто дайджестом. Детальна інформація наведена у трекері видачі докерів.


7
Використовувати docker inspect --format='{{index .RepoDigests 0}}' $IMAGEдля відсутність фігурних дужок (повертає перший індекс масиву)
OhJeez

@OhJeez, дякую, я оновив свою відповідь вашою пропозицією.
Майкл Бартон,

Принаймні , для мене, це також працює для зображень , НЕ тягнули дайджест, але за тегом. Це з Docker 18.09.7.
sleske

В ОС Windows використовуйте подвійні лапки --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
Девід

81

Ви можете отримати це docker images --digests

REPOSITORY          TAG    DIGEST                                                                    IMAGE ID     CREATED        SIZE
docker/ucp-agent    2.1.0  sha256:a428de44a9059f31a59237a5881c2d2cffa93757d99026156e4ea544577ab7f3   583407a61900 3 weeks ago    22.3 MB

Щоб отримати лише дайджести, ви також можете використовувати docker images --format '{{.Digest}}'. Це корисно в foreachзаяві, щоб виконати певну роботу з дайджестами.
Марк Лойман

19

Щойно побачив:

Коли я витягую зображення, код sha256 відображається внизу виводу (Дайджест: sha ....):

docker pull tomcat:7-jre8
7-jre8: Pulling from library/tomcat
902b87aaaec9: Already exists 
9a61b6b1315e: Already exists 
...   
4dcef5c50d60: Already exists 
Digest: sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f
Status: Image is up to date for tomcat:7-jre8

Цей ша-код

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

можна використовувати для витягування зображення за допомогою

докер тягне tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

Таким чином ви можете бути впевнені, що зображення не змінюється і його можна безпечно використовувати для виробництва.


10
Насправді це не повне рішення, оскільки воно обробляє лише зображення в Інтернеті. Що робити, якщо ви хочете sha256 локального зображення?
Zelphir Kaltstahl

19

Найпростіший і стислий спосіб:

docker images --no-trunc --quiet $IMAGE

Це повертає лише sha256:...рядок і нічого іншого.

наприклад:

$ docker images --no-trunc --quiet debian:stretch-slim
sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248

Редагувати:

ПРИМІТКА: це працює лише для локальних зображень. Ви можете docker pull $IMAGEспочатку, якщо потрібно.


7

На додаток до існуючих відповідей, ви можете скористатися цією --digestsопцією, docker imagesщоб отримати список дайджестів для всіх зображень, які у вас є.

docker images --digests

Ви можете додати grep для деталізації

docker images --digests | grep tomcat

5

Це повинно було бути поле Id, яке ви могли бачити у старому застарілому API Docker Hub

GET /v1/repositories/foo/bar/images HTTP/1.1
  Host: index.docker.io
  Accept: application/json

Parameters:

namespace – the namespace for the repo
repo_name – the name for the repo

Приклад відповіді:

HTTP/1.1 200
Vary: Accept
Content-Type: application/json

[{"id": "9e89cc6f0bc3c38722009fe6857087b486531f9a779a0c17e3ed29dae8f12c4f",
"checksum": "b486531f9a779a0c17e3ed29dae8f12c4f9e89cc6f0bc3c38722009fe6857087"},
{"id": "ertwetewtwe38722009fe6857087b486531f9a779a0c1dfddgfgsdgdsgds",
"checksum": "34t23f23fc17e3ed29dae8f12c4f9e89cc6f0bsdfgfsdgdsgdsgerwgew"}]

АЛЕ: зараз це не так працює з новим дистрибутивом докерів .
Див. Випуск 628: "Отримати ідентифікатор зображення з назвою тегу"

Відповідь /v1/реєстру, що /repositories/<repo>/tagsвикористовується для переліку ідентифікатора зображення разом із дескриптором тегу.
/v2/тільки здається, дає ручку.

Було б корисно отримати ідентифікатор для порівняння з місцевим ідентифікатором. Єдине місце, де я можу знайти ідентифікатор, - це v1Compatрозділ маніфесту (що є надмірною для потрібної інформації)

Поточна відповідь (середина 2015 року):

Ця властивість API V1 була дуже обчислювально обчислювальною для зберігання зображень у серверній системі. Перелічуються лише імена тегів, щоб уникнути вторинного пошуку.
Крім того, API V2 не працює з ідентифікаторами зображень. Швидше, він використовує дайджести для ідентифікації шарів, які можна обчислити як властивість шару і перевіряти незалежно.


4

Я виявив, що вищезазначені методи в деяких випадках не працюють. Вони або:

  • погано мати справу з кількома зображеннями з одним і тим же хешем (у випадку пропозиції .RepoDigests - коли ви хочете використовувати певний шлях реєстру)
  • погано працюють при надсиланні зображення до реєстрів (у випадку .Id, де це локальний хеш, а не хеш у реєстрі).

Наведений нижче спосіб є делікатним, але працює для вилучення конкретного повного "імені" та хешу для конкретного контейнера, що надсилається.

Ось сценарій - Зображення завантажується окремо до 2 різних проектів в одному і тому ж репо, тож запит RepoDigests повертає 2 результати.

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest

[gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed gcr.io/beta/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed]

Я хочу використати альфа-результат, але не можу передбачити, який це буде індекс. Тож мені потрібно маніпулювати виведенням тексту, щоб видалити дужки та отримати кожен запис в окремому рядку. Звідти я можу легко отримати результат.

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest | sed 's:^.\(.*\).$:\1:' | tr " " "\n" | grep alpha

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 

3

Як згадував @zelphir, використання дайджестів - це не найкращий спосіб, оскільки він не існує для локального зображення. Я припускаю, що ідентифікатор зображення sha є найбільш точним і послідовним у тегах / витягуванні / натисканні тощо.

docker inspect --format='{{index .Id}}' $IMAGE

Робить фокус.


2

Ви можете знайти його під час витягування зображення з відповідного сховища. Команда "Нижче" згадує Дайджест: sha256 під час витягування зображення докера.

09:33 AM ## ~ ::> docker --version Docker версія 19.03.4, збірка 9013bf5

Дайджест: sha256: 6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d

09:28 AM##~::>docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
**Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d**
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Після завантаження зображення ми можемо зробити наступне

"ubuntu @ sha256: 6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"

09:36 AM##~::>docker inspect ubuntu | grep -i sha256
        "Id": "sha256:775349758637aff77bf85e2ff0597e86e3e859183ef0baba8b3e8fc8d3cba51c",
            **"ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"**
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
                "sha256:cc967c529ced563b7746b663d98248bc571afdb3c012019d7f54d6c092793b8b",
                "sha256:2c6ac8e5063e35e91ab79dfb7330c6154b82f3a7e4724fb1b4475c0a95dfdd33",
                "sha256:6c01b5a53aac53c66f02ea711295c7586061cbe083b110d54dafbeb6cf7636bf",
                "sha256:e0b3afb09dc386786d49d6443bdfb20bc74d77dcf68e152db7e5bb36b1cca638"

1

Просто видайте docker pull tomcat:7-jre8ще раз, і ви отримаєте те, що хочете.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.