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

90

Я хотел бы получить изображения 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
Майкл Бартон,

Ответы:

88

Последний ответ

Правка, предложенная 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

Этот код sha

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

можно использовать, чтобы потом вытащить изображение с помощью

docker pull 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
BKC
источник
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используется для отображения изображения ID вместе с тегом ручкой.
/v2/только кажется, дает ручку.

Было бы полезно получить идентификатор для сравнения с идентификатором, найденным локально. Единственное место, где я могу найти идентификатор, - это v1Compatраздел манифеста (что является излишним для информации, которую я хочу)

Текущий (середина 2015 г.) ответ:

Это свойство API V1 было очень затратным с точки зрения вычислений из-за способа хранения изображений на сервере. Перечисляются только имена тегов, чтобы избежать повторного поиска.
Кроме того, API V2 не имеет дело с идентификаторами изображений. Скорее, он использует дайджесты для идентификации слоев, которые могут быть вычислены как свойство слоя и поддаются независимой проверке.

VonC
источник
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 
gambitx28
источник
3

Как упомянул @zelphir, использование дайджестов - не лучший способ, поскольку он не существует для локального образа. Я предполагаю, что идентификатор изображения sha является наиболее точным и согласованным для тегов / pull / push и т. Д.

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

Делает трюк.

Кристофер
источник
2

Вы можете найти его во время загрузки изображения из соответствующего репозитория. Команда Bellow упоминает Digest: sha256 во время получения образа докера.

09:33 ## ~ ::> 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"
forkdbloke
источник
1

Просто оформляйте еще docker pull tomcat:7-jre8раз, и вы получите то, что хотите.

Петерц
источник