Eu estava tentando descobrir a terminologia do docker sobre ID de imagem, manifestos e resumos, para entender como o docker mantém a integridade de imagens distribuídas. E há um (de muitos) bits inesperados. Acabei de salvar uma imagem existente, descompactá-la e não consigo entender o que há em seu manifest.json
arquivo:
$ docker save 000908da321f > a.tar
$ tar -xvf ./a.tar -C a
$ ls a
blobs index.json manifest.json oci-layout
Aqui index.json
está um manifesto de índice de imagem que aponta para um manifesto específico :
{
"schemaVersion":2,
"mediaType":"application/vnd.oci.image.index.v1+json",
"manifests":
[
{
"mediaType":"application/vnd.oci.image.manifest.v1+json",
"digest":"sha256:dbe15f62d97cfdb1271a9612e4df8bd5d79b11404dcaed42b82e4cf796338f37",
"size":1011
}
]
}
E eu posso encontrar dbe15
em a/blob/sha256/
. Também faz sentido: é um mediaType manifest
com um config
e layers
dentro. E refazer as hashtags com sha256sum
combina com elas.
Mas manifest.json
não segue o esquema de especificação de imagem. É uma lista, e não há schemaVersion
e mediaType
:
[
{
"Config": "blobs/sha256/000908da321ffa9418f599f3476fece162f3903f3f2e9fdd508c8b91ee9008ff",
"Layers": [
"blobs/sha256/08000c18d16dadf9553d747a58cf44023423a9ab010aab96cf263d2216b8b350",
...
],
"LayerSources": { ... },
"RepoTags": null
}
]
Parece um pouco com o que sai de docker image inspect <image ID>
, mas não realmente. O que é esse arquivo e há uma razão pela qual ele é chamado manifest.json
quando não segue o esquema para um manifesto de imagem?
Este
manifest.json
é o método original para rastrear a saída dedocker save
. Ele lista as imagens incluídas, suas tags e ponteiros necessários para carregar a imagem de volta em um mecanismo docker. É um formato específico do docker que não faz parte das especificações OCI.O que há de novo na
docker save
saída é a transição para o uso do OCI Image Layout que veio do moby/moby PR#44833 . Isso adicionou oindex.json
,oci-layout
renomeou os blobs e deu a capacidade de suportar mais casos de uso (compatibilidade com ferramentas e suporte para imagens multiplataforma).Os dois formatos eram compatíveis, portanto, colocá-los na mesma
docker save
saída permite que a saída seja usada por versões mais antigas do Docker.Tudo isso parece periférico aos seus objetivos declarados:
A especificação de imagem OCI cobre isso sem a necessidade de dissecar a
docker save
saída.Isso é fornecido com Content Addressable Storage, Merkle Trees e Directed Acyclic Graphs. Eu começaria aprendendo cada um deles.