Gdzie mogę znaleźć kod sha256 obrazu dockera?

89

Chciałbym pobrać obrazy centów, kocurów, ... używając ich kodu sha256, na przykład w

docker pull myimage@sha256:0ecb2ad60

ale nie mogę znaleźć kodu sha256 do użycia w dowolnym miejscu.

Sprawdziłem repozytorium dockerhub pod kątem jakichkolwiek śladów kodu sha256, ale nie mogłem znaleźć żadnych. Pobrałem obrazy według ich tagu

docker pull tomcat:7-jre8

i sprawdziłem obraz za pomocą, docker inspectaby zobaczyć, czy w metadanych jest kod sha256, ale go nie ma (dodanie kodu sha256 obrazu prawdopodobnie zmieniłoby kod sha256).

Czy muszę sam obliczyć kod sha256 obrazu i go używać?

chrześcijanin
źródło
1
Utworzyłem problem na dockerhub związany z tym - github.com/docker/docker/issues/17670
Michael Barton

Odpowiedzi:

86

Najnowsza odpowiedź

Edycja sugerowana przez OhJeez w komentarzach.

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

Oryginalna odpowiedź

Wierzę, że możesz to również uzyskać za pomocą

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

Działa tylko w Docker 1.9 i jeśli obraz został pierwotnie pobrany przez skrót. Szczegóły znajdują się w narzędziu do śledzenia problemów Dockera.

Michael Barton
źródło
7
Użyj docker inspect --format='{{index .RepoDigests 0}}' $IMAGEbez nawiasów klamrowych (zwraca pierwszy indeks tablicy)
OhJeez
@OhJeez, dzięki, zaktualizowałem moją odpowiedź o twoją sugestię.
Michael Barton
Przynajmniej dla mnie działa to również w przypadku obrazów nie pobieranych przez skrót, ale przez tag. To z Dockerem 18.09.7.
sleske
W systemie Windows użyj podwójnych cudzysłowów --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David
81

Możesz to zdobyć 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
źródło
Aby uzyskać tylko skróty, możesz również użyć docker images --format '{{.Digest}}'. Jest to przydatne w foreachoświadczeniu, aby wykonać trochę pracy z podsumowaniami.
Mark Loyman
19

Właśnie to widziałem:

Kiedy wyciągam obraz, kod sha256 jest wyświetlany na dole wyjścia (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

Ten kod sha

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

może być użyty do późniejszego wyciągnięcia obrazu za pomocą

docker pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

Dzięki temu masz pewność, że obraz nie zostanie zmieniony i można go bezpiecznie wykorzystać do produkcji.

chrześcijanin
źródło
10
To naprawdę nie jest kompletne rozwiązanie, ponieważ traktuje tylko obrazy online. A co jeśli chcesz sha256 lokalnego obrazu?
Zelphir Kaltstahl
19

Najprostszy i najbardziej zwięzły sposób to:

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

Zwraca tylko sha256:...ciąg i nic więcej.

na przykład:

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

Edytować:

UWAGA: działa to tylko w przypadku obrazów lokalnych. W docker pull $IMAGErazie potrzeby możesz najpierw.

Greg Bacchus
źródło
7

Oprócz istniejących odpowiedzi możesz skorzystać z --digestsopcji podczas wykonywania, docker imagesaby uzyskać listę podsumowań wszystkich posiadanych obrazów.

docker images --digests

Możesz dodać grep, aby przejść dalej

docker images --digests | grep tomcat
BKC
źródło
5

Powinno to być pole Id, które można było zobaczyć w starym, przestarzałym interfejsie API Docker Hub

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

Przykładowa odpowiedź:

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

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

ALE: tak nie działa teraz z nową dystrybucją Dockera .
Zobacz problem 628: „Pobierz identyfikator obrazu z nazwą tagu”

Odpowiedź /v1/rejestru /repositories/<repo>/tagsużywana do wyświetlenia identyfikatora obrazu wraz z uchwytem znacznika.
/v2/tylko wydaje się, że daje uchwyt.

Przydałoby się porównanie identyfikatora z identyfikatorem znalezionym lokalnie. Jedyne miejsce, w którym mogę znaleźć identyfikator, znajduje się w v1Compatsekcji manifestu (co jest przesadą, jeśli chodzi o informacje, których chcę)

Obecna (połowa 2015 r.) Odpowiedź brzmi:

Ta właściwość interfejsu API V1 była bardzo kosztowna obliczeniowo ze względu na sposób przechowywania obrazów na zapleczu. Aby uniknąć dodatkowego wyszukiwania, wyliczane są tylko nazwy znaczników.
Ponadto interfejs API V2 nie obsługuje identyfikatorów obrazów. Zamiast tego używa skrótów do identyfikacji warstw, które można obliczyć jako właściwość warstwy i które można niezależnie zweryfikować.

VonC
źródło
4

Powyższe metody nie działają w niektórych przypadkach. Oni albo:

  • nie radzi sobie dobrze z wieloma obrazami z tym samym hashem (w przypadku sugestii .RepoDigests - gdy chcesz użyć określonej ścieżki rejestru)
  • nie działa dobrze podczas wypychania obrazu do rejestrów (w przypadku .Id, gdzie jest to lokalny hash, a nie hash w rejestrze).

Poniższa metoda jest delikatna, ale działa w celu wyodrębnienia określonej pełnej „nazwy” i skrótu dla konkretnego wypychanego pojemnika.

Oto scenariusz - obraz jest przesyłany oddzielnie do 2 różnych projektów w tym samym repozytorium, więc zapytanie RepoDigests zwraca 2 wyniki.

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

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

Chcę użyć wyniku alfa, ale nie mogę przewidzieć, który to będzie indeks. Dlatego muszę manipulować wyjściem tekstowym, aby usunąć nawiasy i umieścić każdy wpis w osobnym wierszu. Stamtąd mogę łatwo uzyskać wynik.

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

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 
gambitx28
źródło
3

Jak wspomniał @zelphir, używanie skrótów nie jest dobrym sposobem, ponieważ nie istnieje dla obrazu tylko lokalnego. Zakładam, że identyfikator obrazu sha jest najbardziej dokładny i spójny w przypadku tagów / ciągnięcia / wypychania itp.

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

Zrób sztuczkę.

Kristofer
źródło
2

Możesz go znaleźć w momencie pobierania obrazu z odpowiedniego repozytorium. Polecenie poniżej wspomina Digest: sha256 w momencie ściągania obrazu dockera.

09:33 ## ~ ::> docker --version Docker wersja 19.03.4, kompilacja 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

Po pobraniu obrazu możemy wykonać następujące czynności

„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
źródło
1

Po prostu wystaw docker pull tomcat:7-jre8ponownie, a otrzymasz to, czego chcesz.

petertc
źródło