Wo finde ich den sha256-Code eines Docker-Images?

90

Ich möchte die Bilder von Centos, Tomcat, ... mit ihrem sha256-Code ziehen, wie in

docker pull myimage@sha256:0ecb2ad60

aber ich kann den sha256-code nirgendwo finden.

Ich habe im Dockerhub-Repository nach Hinweisen auf den sha256-Code gesucht, aber keine gefunden. Ich habe die Bilder nach ihrem Tag heruntergeladen

docker pull tomcat:7-jre8

und überprüfte das Bild mit docker inspect, um festzustellen, ob es einen sha256-Code in den Metadaten gibt, aber es gibt keinen (das Hinzufügen des sha256-Codes des Bildes würde wahrscheinlich den sha256-Code ändern).

Muss ich den sha256-Code eines Bildes selbst berechnen und verwenden?

Christian
quelle
1
Ich habe ein Problem auf Dockerhub im Zusammenhang mit diesem erstellt - github.com/docker/docker/issues/17670
Michael Barton

Antworten:

88

Letzte Antwort

Bearbeiten vorgeschlagen von OhJeez in den Kommentaren.

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

Ursprüngliche Antwort

Ich glaube, Sie können dies auch mit bekommen

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

Funktioniert nur in Docker 1.9 und wenn das Image ursprünglich vom Digest gezogen wurde. Details finden Sie im Docker Issue Tracker.

Michael Barton
quelle
7
Verwenden Sie docker inspect --format='{{index .RepoDigests 0}}' $IMAGEfür keine geschweiften Klammern (gibt den ersten Index des Arrays zurück)
OhJeez
@ OhJeez, danke Ich habe meine Antwort mit Ihrem Vorschlag aktualisiert.
Michael Barton
Zumindest für mich funktioniert dies auch für Bilder, die nicht durch Digest, sondern durch Tag erstellt wurden. Das ist mit Docker 18.09.7.
Sleske
Verwenden Sie unter Windows doppelte Anführungszeichen --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David
81

Sie können es durch bekommen 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
quelle
Um nur die Digests zu erhalten, können Sie auch verwenden docker images --format '{{.Digest}}'. Dies ist in einer foreachAnweisung nützlich , um einige Arbeiten mit den Digests zu erledigen.
Mark Loyman
19

Hab es gerade gesehen:

Wenn ich ein Bild ziehe, wird der sha256-Code am unteren Rand der Ausgabe angezeigt (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

Dieser sha Code

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

kann verwendet werden, um das Bild anschließend mit zu ziehen

Docker ziehen Tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

Auf diese Weise können Sie sicher sein, dass das Bild nicht geändert wird und sicher für die Produktion verwendet werden kann.

Christian
quelle
10
Dies ist keine vollständige Lösung, da nur Bilder online behandelt werden. Was ist, wenn Sie den sha256 eines lokalen Bildes möchten?
Zelphir Kaltstahl
19

Der einfachste und prägnanteste Weg ist:

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

Dies gibt nur die zurück sha256:... Zeichenfolge und nichts anderes zurück.

z.B:

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

Bearbeiten:

HINWEIS: Dies funktioniert nur für lokale Bilder. Sie können docker pull $IMAGEbei Bedarf zuerst.

Greg Bacchus
quelle
7

Zusätzlich zu den vorhandenen Antworten können Sie die --digestsOption verwenden docker images, um eine Liste der Zusammenfassungen für alle Bilder zu erhalten, die Sie haben.

docker images --digests

Sie können einen Grep hinzufügen, um einen weiteren Drilldown durchzuführen

docker images --digests | grep tomcat
BKC
quelle
5

Dies sollte das ID-Feld gewesen sein, das Sie in der alten veralteten Docker Hub-API sehen konnten

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

Beispielantwort:

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

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

ABER: Das ist nicht , wie es jetzt mit der arbeitet neue Docker Verteilung .
Siehe Problem 628: "Bild-ID mit Tag-Namen abrufen"

Die /v1/Registrierungsantwort /repositories/<repo>/tags, mit der die Bild-ID zusammen mit dem Tag-Handle aufgelistet wird.
/v2/scheint nur den Griff zu geben.

Es wäre nützlich, die ID zu erhalten, um sie mit der lokal gefundenen ID zu vergleichen. Der einzige Ort, an dem ich die ID finden kann, ist der v1CompatAbschnitt des Manifests (der für die gewünschten Informationen übertrieben ist).

Die aktuelle Antwort (Mitte 2015) lautet:

Diese Eigenschaft der V1-API war für die Art und Weise, wie Bilder im Backend gespeichert werden, sehr rechenintensiv. Nur die Tag-Namen werden aufgelistet, um eine sekundäre Suche zu vermeiden.
Darüber hinaus verarbeitet die V2-API keine Image-IDs. Vielmehr werden Digests verwendet, um Ebenen zu identifizieren, die als Eigenschaft der Ebene berechnet werden können und unabhängig überprüfbar sind.

VonC
quelle
4

Ich habe festgestellt, dass die oben genannten Methoden in einigen Fällen nicht funktionieren. Sie entweder:

  • Gehen Sie nicht gut mit mehreren Bildern mit demselben Hash um (im Fall des Vorschlags .RepoDigests - wenn Sie einen bestimmten Registrierungspfad verwenden möchten)
  • funktioniert nicht gut, wenn das Bild an Registries gesendet wird (im Fall von .Id, bei der es sich um einen lokalen Hash handelt, nicht um den Hash in der Registrierung).

Die folgende Methode ist heikel, funktioniert jedoch zum Extrahieren des spezifischen vollständigen "Namens" und des Hashs für einen bestimmten Push-Container.

Hier ist das Szenario: Ein Bild wird separat in zwei verschiedene Projekte im selben Repo hochgeladen. Wenn Sie also RepoDigests abfragen, erhalten Sie zwei Ergebnisse.

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

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

Ich möchte das Alpha-Ergebnis verwenden, kann aber nicht vorhersagen, um welchen Index es sich handelt. Ich muss also die Textausgabe manipulieren, um die Klammern zu entfernen und jeden Eintrag in einer separaten Zeile abzurufen. Von dort kann ich das Ergebnis leicht erfassen.

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

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

Wie von @zelphir erwähnt, ist die Verwendung von Digests kein guter Weg, da sie für ein nur lokales Image nicht vorhanden ist. Ich gehe davon aus, dass die Bild-ID sha über Tags / Pull / Push usw. hinweg am genauesten und konsistentesten ist.

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

Macht den Trick.

Kristofer
quelle
2

Sie finden es zum Zeitpunkt des Abrufs des Bildes aus dem jeweiligen Repository. Der folgende Befehl erwähnt Digest: sha256 zum Zeitpunkt des Abrufs des Docker-Images.

09:33 ## ~ ::> 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

Sobald das Bild heruntergeladen ist, können wir Folgendes tun

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"
Forkdbloke
quelle
1

Einfach docker pull tomcat:7-jre8nochmal ausstellen und du bekommst was du willst.

petertc
quelle