Dove posso trovare il codice sha256 di un'immagine docker?


94

Vorrei estrarre le immagini di CentOS, Tomcat, ... usando il loro codice sha256, come in

docker pull myimage@sha256:0ecb2ad60

Ma non riesco a trovare il codice sha256 da utilizzare ovunque.

Ho controllato il repository DockerHub per qualsiasi suggerimento del codice sha256, ma non sono riuscito a trovarne. Ho scaricato le immagini tramite il loro tag

docker pull tomcat:7-jre8

e controllato l'immagine con docker inspectper vedere se c'è un codice sha256 nei metadati, ma non ce n'è nessuno (l'aggiunta del codice sha256 dell'immagine probabilmente cambierebbe il codice sha256).

Devo calcolare io stesso il codice sha256 di un'immagine e usarlo?


1
Ho creato un problema su dockerhub relativo a questo - github.com/docker/docker/issues/17670
Michael Barton

Risposte:


97

Ultima risposta

Modifica suggerita da OhJeez nei commenti.

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

Risposta originale

Credo che tu possa ottenerlo anche usando

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

Funziona solo in Docker 1.9 e se l'immagine è stata originariamente estratta dal digest. I dettagli sono sul rilevatore dei problemi della finestra mobile.


8
Usa docker inspect --format='{{index .RepoDigests 0}}' $IMAGEper nessuna parentesi graffa (restituisce il primo indice dell'array)
OhJeez

@OhJeez, grazie ho aggiornato la mia risposta con il tuo suggerimento.
Michael Barton

Almeno per me, questo funziona anche per le immagini non estratte da digest, ma da tag. Questo è con Docker 18.09.7.
sleske

In Windows, utilizza le virgolette doppie --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David

Dopo aver esaminato questo post, si potrebbe voler dare un'occhiata anche al post sottostante. stackoverflow.com/questions/56364643/...
vaibhavnd

85

Puoi ottenerlo 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

1
Per ottenere solo i digest, puoi anche usare docker images --format '{{.Digest}}'. Questo è utile in una foreachdichiarazione per portare a termine un po 'di lavoro con i digest.
Mark Loyman

22

Il modo più semplice e conciso è:

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

Ciò restituisce solo la sha256:...stringa e nient'altro.

per esempio:

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

Modificare:

NOTA: funziona solo per le immagini locali. Puoi docker pull $IMAGEprima, se necessario.


19

L'ho appena visto:

Quando estraggo un'immagine, il codice sha256 viene visualizzato nella parte inferiore dell'output (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

Questo codice sha

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

può essere utilizzato per estrarre l'immagine successivamente con

docker pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

In questo modo puoi essere sicuro che l'immagine non viene modificata e può essere tranquillamente utilizzata per la produzione.


10
Questa non è davvero una soluzione completa, poiché tratta solo le immagini online. E se volessi lo sha256 di un'immagine locale?
Zelphir Kaltstahl

7

Oltre alle risposte esistenti, puoi usare l' --digestsopzione mentre fai docker imagesper ottenere un elenco di riassunti per tutte le immagini che hai.

docker images --digests

Puoi aggiungere un grep per approfondire ulteriormente

docker images --digests | grep tomcat

5

Questo avrebbe dovuto essere il campo Id, che potresti vedere nella vecchia API Docker Hub deprecata

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

Risposta di esempio:

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

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

MA: non è così che funziona ora con la nuova distribuzione docker .
Vedi problema 628: "Ottieni l'ID immagine con il nome del tag"

La /v1/risposta del registro /repositories/<repo>/tagsutilizzata per elencare l'ID immagine insieme all'handle del tag.
/v2/sembra solo dare la maniglia.

Sarebbe utile ottenere l'ID da confrontare con l'ID trovato localmente. L'unico posto in cui posso trovare l'ID è nella v1Compatsezione del manifest (che è eccessivo per le informazioni che voglio)

La risposta attuale (metà 2015) è:

Questa proprietà dell'API V1 era molto dispendiosa dal punto di vista del calcolo per il modo in cui le immagini vengono archiviate nel back-end. Vengono enumerati solo i nomi dei tag per evitare una ricerca secondaria.
Inoltre, l'API V2 non si occupa degli ID immagine. Piuttosto, utilizza i digest per identificare i livelli, che possono essere calcolati come proprietà del livello e sono verificabili in modo indipendente.


4

Ho scoperto che i metodi di cui sopra non funzionano in alcuni casi. O loro:

  • non gestire bene più immagini con lo stesso hash (nel caso del suggerimento .RepoDigests - quando si desidera utilizzare un percorso di registro specifico)
  • non funzionano bene quando si invia l'immagine ai registri (nel caso di .Id dove è un hash locale, non l'hash nel registro).

Il metodo seguente è delicato, ma funziona per estrarre il "nome" completo specifico e l'hash per uno specifico contenitore inserito.

Ecco lo scenario: un'immagine viene caricata separatamente in 2 progetti diversi nello stesso repository, quindi l'interrogazione di RepoDigests restituisce 2 risultati.

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

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

Voglio usare il risultato alfa, ma non posso prevedere quale indice sarà. Quindi ho bisogno di manipolare l'output di testo per rimuovere le parentesi e ottenere ogni voce su una riga separata. Da lì posso facilmente grep il risultato.

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

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 

3

Come menzionato da @zelphir, l'uso di digest non è un buon modo poiché non esiste per un'immagine solo locale. Presumo che l'ID immagine sha sia il più preciso e coerente tra tag / pull / push ecc.

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

Fa il trucco.


2

Puoi trovarlo al momento dell'estrazione dell'immagine dal rispettivo repository. Il comando seguente menziona Digest: sha256 al momento dell'estrazione dell'immagine docker.

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

Digest: 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 volta scaricata l'immagine, possiamo eseguire le seguenti operazioni

"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"

1

Emetti di docker pull tomcat:7-jre8nuovo e otterrai ciò che desideri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.