Почему дайджесты различаются в зависимости от реестра?

AFAIK, дайджест изображения - это хэш тела манифеста изображения.

Когда я извлекаю образ busybox из докер-хаба и помещаю его в свой частный реестр, дайджесты становятся другими.

$ docker pull busybox
...
Digest: sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4
Status: Downloaded newer image for busybox:latest

$ docker tag busybox myregistry/busybox
$ docker push myregistry/busybox
...
08c2295a7fa5: Pushed
latest: digest: sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac size: 527

$ docker images --digests
myregistry/busybox    latest      sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac   efe10ee6727f        2 weeks ago         1.13MB
busybox               latest      sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4   efe10ee6727f        2 weeks ago         1.13MB

Изображения вообще не меняются, а идентификаторы изображений совпадают.

Но почему дайджесты изображений получаются разными?


Обновлено:

Интересно, что дайджест из другого частного реестра точно такой же, как дайджест из моего личного реестра.

$ docker image inspect efe10ee6727f
...
"RepoDigests": [
            "myregistry/busybox@sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac",
            "busybox@sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4",
            "anotherregistry/busybox@sha256:8573b4a813d7b90ef3876c6bec33db1272c02f0f90c406b25a5f9729169548ac"
        ],

person SunghoMoon    schedule 06.08.2017    source источник


Ответы (1)


Дайджесты, на которые вы смотрите, — это дайджесты реестра, которые отличаются от дайджеста идентификатора изображения. У вас может быть идентификатор изображения с разными ссылками в реестре (и, возможно, дайджестами) для всех мест, куда он был отправлен. Вы можете увидеть два идентификатора в выводе проверки:

$ docker inspect busybox --format 'Id: {{.Id}}
Repo Digest: {{index .RepoDigests 0}}'
Id: sha256:efe10ee6727fe52d2db2eb5045518fe98d8e31fdad1cbdd5e1f737018c349ebb
Repo Digest: busybox@sha256:2605a2c4875ce5eb27a9f7403263190cd1af31e48a2044d400320548356251c4

Если реестр использует старый манифест v1, имя репозитория и тег являются частью этого манифеста, что означает, что он будет меняться при перемещении между реестрами:

{
   "name": <name>,
   "tag": <tag>,
   "fsLayers": [
      {
         "blobSum": "<digest>"
      },
      ...
    ]
   ],
   "history": <v1 images>,
   "signature": <JWS>
}

Однако для манифестов OCI и манифесты Docker v2, это больше не так, и вы должны увидеть тот же дайджест реестра для того же образа:

{
    "schemaVersion": 2,
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "config": {
        "mediaType": "application/vnd.docker.container.image.v1+json",
        "size": 7023,
        "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
    },
    "layers": [
        {
            "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
            "size": 32654,
            "digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
        },
        {
            "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
            "size": 16724,
            "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b"
        },
        {
            "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
            "size": 73109,
            "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
        }
    ]
}

Сами дайджесты представляют собой дайджест контента sha256, который вы также можете найти в реализации OCI. Когда вы извлекаете изображение локально, некоторые вещи меняются, в том числе распаковываются слои, а мультиплатформенные изображения разыменовываются на вашей локальной платформе. Из-за этих изменений дайджест содержимого изменится, а идентификатор изображения не будет соответствовать дайджесту реестра.

Поэтому, чтобы сравнить образы между реестрами, убедитесь, что вы указали, что вам нужна схема v2 с заголовком accept, иначе реестр преобразует результат обратно в схему v1. В curl передача этих заголовков выглядит так:

curl \
  -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
  -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
  http://$registry/v2/$repo/manifests/$tag
person BMitch    schedule 06.08.2017
comment
Для схемы 2 манифеста v2 поле "имя" отсутствует. больше. И я обнаружил, что дайджест, сгенерированный другим частным реестром, точно такой же, как и дайджест из моего частного реестра. Если схема манифеста Docker Hub отличается от схемы частного реестра, имеет ли это смысл? - person SunghoMoon; 07.08.2017
comment
Вы можете сравнить несколько частных серверов реестра, чтобы убедиться, что это так. - person BMitch; 07.08.2017
comment
Эта концепция дайджеста реестра на самом деле не очень полезна для случая быстрой проверки того, что одно и то же изображение передается везде. Почему он отображается по умолчанию в Openshift, Artifactory и т. д., в лучшем случае кажется бесполезным. Мне не нужно копаться, чтобы проверить, что должно быть просто. - person Ed Randall; 09.04.2021
comment
@EdRandall многое изменилось с тех пор, как на этот вопрос был впервые дан ответ, и вряд ли кто-то все еще использует старые манифесты v1. - person BMitch; 09.04.2021