Où puis-je trouver le code sha256 d'une image docker?

90

Je voudrais tirer les images de centos, tomcat, ... en utilisant leur code sha256, comme dans

docker pull myimage@sha256:0ecb2ad60

mais je ne trouve pas le code sha256 à utiliser nulle part.

J'ai vérifié le référentiel dockerhub pour tout indice du code sha256, mais je n'en ai trouvé aucun. J'ai téléchargé les images par leur tag

docker pull tomcat:7-jre8

et vérifié l'image avec docker inspectpour voir s'il y a un code sha256 dans les métadonnées, mais il n'y en a pas (l'ajout du code sha256 de l'image changerait probablement le code sha256).

Dois-je calculer moi-même le code sha256 d'une image et l'utiliser?

Christian
la source
1
J'ai créé un problème sur dockerhub lié à cela - github.com/docker/docker/issues/17670
Michael Barton

Réponses:

88

Dernière réponse

Edit suggéré par OhJeez dans les commentaires.

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

Réponse originale

Je pense que vous pouvez également obtenir cela en utilisant

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

Fonctionne uniquement dans Docker 1.9 et si l'image a été extraite à l'origine par le condensé. Les détails sont sur le tracker de problèmes de docker.

Michael Barton
la source
7
Utiliser docker inspect --format='{{index .RepoDigests 0}}' $IMAGEsans accolades (retourne le premier index du tableau)
OhJeez
@OhJeez, merci d'avoir mis à jour ma réponse avec votre suggestion.
Michael Barton
Au moins pour moi, cela fonctionne également pour les images non tirées par résumé, mais par tag. C'est avec Docker 18.09.7.
sleske
Sous Windows, veuillez utiliser des guillemets doubles --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David
81

Vous pouvez l'obtenir 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
la source
Pour obtenir uniquement les résumés, vous pouvez également utiliser docker images --format '{{.Digest}}'. Ceci est utile dans une foreachinstruction pour travailler avec les résumés.
Mark Loyman le
19

Je viens de le voir:

Lorsque je tire une image, le code sha256 est affiché en bas de la sortie (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

Ce code sha

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

peut être utilisé pour tirer l'image par la suite avec

docker pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

De cette façon, vous pouvez être sûr que l'image n'est pas modifiée et peut être utilisée en toute sécurité pour la production.

Christian
la source
10
Ce n'est pas vraiment une solution complète, car elle ne traite que les images en ligne. Et si vous voulez le sha256 d'une image locale?
Zelphir Kaltstahl
19

Le moyen le plus simple et le plus concis est:

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

Cela ne renvoie que la sha256:...chaîne et rien d'autre.

par exemple:

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

Éditer:

REMARQUE: cela ne fonctionne que pour les images locales. Vous pouvez d' docker pull $IMAGEabord, si nécessaire.

Greg Bacchus
la source
7

En plus des réponses existantes, vous pouvez utiliser l' --digestsoption tout en faisant docker imagespour obtenir une liste de résumés pour toutes les images que vous avez.

docker images --digests

Vous pouvez ajouter un grep pour approfondir

docker images --digests | grep tomcat
BKC
la source
5

Cela aurait dû être le champ Id, que vous pouviez voir dans l'ancienne API Docker Hub obsolète

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

Exemple de réponse:

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

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

MAIS: ce n'est pas ainsi que cela fonctionne maintenant avec la nouvelle distribution de docker .
Voir le problème 628: "Obtenir l'ID d'image avec le nom de la balise"

La /v1/réponse de registre /repositories/<repo>/tagsutilisé pour lister l'ID d'image ainsi que la poignée de l' étiquette.
/v2/semble seulement donner le manche.

Il serait utile de comparer l'ID à l'ID trouvé localement. Le seul endroit où je peux trouver l'ID est dans la v1Compatsection du manifeste (ce qui est excessif pour les informations que je veux)

La réponse actuelle (mi-2015) est:

Cette propriété de l'API V1 était très coûteuse en calcul pour la façon dont les images sont stockées sur le backend. Seuls les noms de balises sont énumérés pour éviter une recherche secondaire.
De plus, l'API V2 ne traite pas les ID d'image. Au contraire, il utilise des résumés pour identifier les couches, qui peuvent être calculées comme propriété de la couche et sont vérifiables indépendamment.

VonC
la source
4

J'ai trouvé que les méthodes ci-dessus ne fonctionnaient pas dans certains cas. Ils soit:

  • ne gère pas bien plusieurs images avec le même hachage (dans le cas de la suggestion .RepoDigests - lorsque vous souhaitez utiliser un chemin de registre spécifique)
  • ne fonctionne pas bien lors du transfert de l'image vers les registres (dans le cas de .Id où il s'agit d'un hachage local, pas du hachage dans le registre).

La méthode ci-dessous est délicate, mais fonctionne pour extraire le «nom» complet spécifique et le hachage pour un conteneur poussé spécifique.

Voici le scénario - Une image est téléchargée séparément vers 2 projets différents dans le même dépôt, donc l'interrogation de RepoDigests renvoie 2 résultats.

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

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

Je veux utiliser le résultat alpha, mais je ne peux pas prédire de quel index il s'agira. Je dois donc manipuler la sortie de texte pour supprimer les crochets et obtenir chaque entrée sur une ligne distincte. De là, je peux facilement grep le résultat.

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

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

Comme mentionné par @zelphir, utiliser des résumés n'est pas un bon moyen car il n'existe pas pour une image uniquement locale. Je suppose que l'ID d'image sha est le plus précis et le plus cohérent entre les balises / pull / push, etc.

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

Fait l'affaire.

Kristofer
la source
2

Vous pouvez le trouver au moment de l'extraction de l'image du référentiel respectif. La commande ci-dessous mentionne Digest: sha256 au moment de l'extraction de l'image du docker.

09:33 AM ## ~ ::> docker - version Docker version 19.03.4, build 9013bf5

Résumé: 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

Une fois l'image téléchargée, nous pouvons faire ce qui suit

"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"
fourche
la source
1

Émettez à docker pull tomcat:7-jre8nouveau et vous obtiendrez ce que vous voulez.

petertc
la source