Почему у моего только что созданного докера нет дайджеста?

Я следил за руководством по Docker здесь и создал тест образ на моем локальном компьютере с OSX, зафиксировав изменения в существующем образе и пометив его тремя разными метками:

# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
adamatan/sinatra         devel               fccb6b4d21b4        8 minutes ago       469.5 MB
adamatan/sinatra         junk                fccb6b4d21b4        8 minutes ago       469.5 MB
adamatan/sinatra         latest              fccb6b4d21b4        8 minutes ago       469.5 MB

Однако ни у одного из этих изображений нет дайджеста:

# docker images --digests adamatan/sinatra
REPOSITORY          TAG                 DIGEST              IMAGE ID            CREATED             SIZE
adamatan/sinatra    devel               <none>              fccb6b4d21b4        9 minutes ago       469.5 MB
adamatan/sinatra    junk                <none>              fccb6b4d21b4        9 minutes ago       469.5 MB
adamatan/sinatra    latest              <none>              fccb6b4d21b4        9 minutes ago       469.5 MB

У других тестовых образов, которые я создал с помощью Dockerfile, есть дайджест.

Почему у одних изображений есть дайджест, а у других нет? Связано ли это со способом создания образов (Dockerfile или нет)?


person Adam Matan    schedule 01.10.2016    source источник


Ответы (3)


Во-первых, имейте в виду, что дайджест может представлять собой manifest, слой или их комбинацию (мы обычно называем эту комбинацию изображением).

Manifest — это новый термин, введенный в реестре Docker V2. Вот краткое описание, взятое с слайдов Docker Registry V2 стр. 21 ~ стр. 23:

  • [Manifest] describes the components of an image in a single object
    • Layers can be fetched immediately, in parallel.

Когда вы получаете дайджесты с помощью команды docker images --digests, здесь дайджест — это хэш SHA256 манифеста изображения, а идентификатор изображения — это хэш-код конфигурации JSON локального изображения (эта конфигурация отличается от манифеста). В этом случае, если изображение не имеет связанного манифеста, дайджест этого изображения будет «нет».

Обычно два сценария могут привести к тому, что образ не будет связан с манифестом:

  1. Этот образ не был передан в реестр версии 2 или извлечен из него.
  2. Этот образ был извлечен из реестра версии 1.

Чтобы сгенерировать манифест, проще всего отправить образ в реестр V2 (реестр V1 не будет работать). Клиент Docker создаст манифест локально, а затем отправит его вместе со слоями образа в реестр. Когда вы вернете изображение обратно, оно будет иметь манифест.

После того, как манифест существует, ваш дайджест изображения не должен быть «нет».

person Haoming Zhang    schedule 01.10.2016
comment
Есть новая «экспериментальная» команда docker manifest, но она все еще не совсем делает то, что на самом деле хотел бы пользователь, т.е. создать манифест локально для изображения, в котором отсутствует один. - person Ed Randall; 26.02.2020

Да, это связано с тем, как были созданы изображения. Докер иногда может быть настоящим вонючкой.

В этом случае вам может помочь Это.

person Colin    schedule 01.10.2016
comment
Это безумие - docker inspect <image> напечатает дайджест, хотя docker images --digests напечатает <none>. - person Ed Randall; 26.02.2020
comment
Да. Не знаю, что об этом думать. Ошибка? Преднамеренный дизайн? Докер сложен, если подумать. Я бы приложил руку к жуку. Подчинится им. - person Colin; 02.07.2020
comment
@EdRandall спасибо за это. Я сходил с ума из-за несвязанной проблемы со скаффолдом, это очень помогло. - person Eugene; 30.06.2021

Я также столкнулся с этой проблемой (дайджеста не было).

Причина была в том, что я могу образ докера, и изображение было указано в образах докеров.

В этот момент я проверял значение дайджеста, используя

docker images --digest

и значение дайджеста имеет вид <none>.

Решение:

Поместите изображение в свой репозиторий докеров, после чего изображение покажет значение дайджеста.

person ajay    schedule 28.05.2020