¿Dónde puedo encontrar el código sha256 de una imagen de Docker?

90

Me gustaría sacar las imágenes de centos, tomcat, ... usando su código sha256, como en

docker pull myimage@sha256:0ecb2ad60

pero no puedo encontrar el código sha256 para usar en ninguna parte.

Revisé el repositorio de dockerhub en busca de algún indicio del código sha256, pero no pude encontrar ninguno. Descargué las imágenes por su etiqueta

docker pull tomcat:7-jre8

y verifiqué la imagen con docker inspectpara ver si hay un código sha256 en los metadatos, pero no hay ninguno (agregar el código sha256 de la imagen probablemente cambiaría el código sha256).

¿Tengo que calcular el código sha256 de una imagen yo mismo y usarlo?

cristiano
fuente
1
Creé un problema en dockerhub relacionado con esto - github.com/docker/docker/issues/17670
Michael Barton

Respuestas:

88

Última respuesta

Edición sugerida por OhJeez en los comentarios.

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

Respuesta original

Creo que también puede obtener esto usando

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

Funciona solo en Docker 1.9 y si la imagen fue originalmente extraída por el resumen. Los detalles se encuentran en el rastreador de problemas de Docker.

Michael Barton
fuente
7
Usar docker inspect --format='{{index .RepoDigests 0}}' $IMAGEsin llaves (devuelve el primer índice de la matriz)
OhJeez
@OhJeez, gracias He actualizado mi respuesta con tu sugerencia.
Michael Barton
Al menos para mí, esto también funciona para imágenes no extraídas por resumen, sino por etiqueta. Eso es con Docker 18.09.7.
sleske
En Windows, utilice comillas dobles --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David
81

Puedes conseguirlo 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
Rajarajan Pudupatti Sundari Je
fuente
Para obtener solo los resúmenes, también puede usar docker images --format '{{.Digest}}'. Esto es útil en una foreachdeclaración para trabajar un poco con los resúmenes.
Mark Loyman
19

Acabo de verlo:

Cuando saco una imagen, el código sha256 se muestra en la parte inferior de la salida (Digest: 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

Este código sha

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

se puede utilizar para extraer la imagen posteriormente con

Docker pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

De esta manera, puede estar seguro de que la imagen no se modifica y se puede utilizar de forma segura para la producción.

cristiano
fuente
10
Esta no es realmente una solución completa, ya que solo trata imágenes en línea. ¿Qué pasa si quieres el sha256 de una imagen local?
Zelphir Kaltstahl
19

La forma más sencilla y concisa es:

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

Esto devuelve solo la sha256:...cadena y nada más.

p.ej:

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

Editar:

NOTA: esto solo funciona para imágenes que son locales. docker pull $IMAGEPrimero puede , si es necesario.

Greg Bacchus
fuente
7

Además de las respuestas existentes, puede utilizar la --digestsopción mientras lo hace docker imagespara obtener una lista de resúmenes de todas las imágenes que tiene.

docker images --digests

Puede agregar un grep para profundizar más

docker images --digests | grep tomcat
BKC
fuente
5

Este debería haber sido el campo Id, que podría ver en la antigua API de Docker Hub en desuso

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

Respuesta de ejemplo:

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

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

PERO: así no es como funciona ahora con la nueva distribución de Docker .
Consulte el problema 628: "Obtener ID de imagen con nombre de etiqueta".

La /v1/respuesta del registro /repositories/<repo>/tagsutilizada para enumerar el ID de la imagen junto con el identificador de la etiqueta.
/v2/solo parece dar el mango.

Sería útil obtener la identificación para compararla con la identificación local. El único lugar donde puedo encontrar la identificación es en la v1Compatsección del manifiesto (que es excesivo para la información que quiero)

La respuesta actual (mediados de 2015) es:

Esta propiedad de la API V1 era muy costosa computacionalmente por la forma en que se almacenan las imágenes en el backend. Solo se enumeran los nombres de las etiquetas para evitar una búsqueda secundaria.
Además, la API V2 no se ocupa de ID de imagen. Más bien, utiliza resúmenes para identificar capas, que se pueden calcular como propiedad de la capa y son verificables de forma independiente.

VonC
fuente
4

Encontré que los métodos anteriores no funcionan en algunos casos. O bien:

  • no trate bien con varias imágenes con el mismo hash (en el caso de la sugerencia de .RepoDigests, cuando desee utilizar una ruta de registro específica)
  • no funciona bien al enviar la imagen a los registros (en el caso de .Id, donde es un hash local, no el hash en el registro).

El siguiente método es delicado, pero funciona para extraer el 'nombre' completo y el hash específicos para un contenedor empujado específico.

Aquí está el escenario: una imagen se carga por separado en 2 proyectos diferentes en el mismo repositorio, por lo que consultar RepoDigests devuelve 2 resultados.

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

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

Quiero usar el resultado alfa, pero no puedo predecir qué índice será. Entonces, necesito manipular la salida de texto para eliminar los corchetes y obtener cada entrada en una línea separada. A partir de ahí, puedo grep fácilmente el resultado.

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

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 
gambitx28
fuente
3

Como lo mencionó @zelphir, usar resúmenes no es una buena manera, ya que no existe para una imagen solo local. Supongo que la ID de la imagen es la más precisa y consistente en todas las etiquetas / tirar / empujar, etc.

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

Hace el truco.

Kristofer
fuente
2

Puede encontrarlo al momento de sacar la imagen del repositorio respectivo. El comando de abajo menciona Digest: sha256 en el momento de extraer la imagen de la ventana acoplable.

09:33 AM ## ~ ::> docker --version Docker versión 19.03.4, compilación 9013bf5

Resumen: 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

Una vez descargada la imagen, podemos hacer lo siguiente

"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"
bifurcación
fuente
1

Simplemente emita de docker pull tomcat:7-jre8nuevo y obtendrá lo que desea.

petertc
fuente