Di mana saya dapat menemukan kode sha256 dari gambar buruh pelabuhan?

90

Saya ingin menarik gambar centos, tomcat, ... menggunakan kode sha256 mereka, seperti di

docker pull myimage@sha256:0ecb2ad60

tetapi saya tidak dapat menemukan kode sha256 untuk digunakan di mana pun.

Saya memeriksa repositori dockerhub untuk petunjuk apa pun tentang kode sha256, tetapi tidak dapat menemukannya. Saya mengunduh gambar dengan tag mereka

docker pull tomcat:7-jre8

dan memeriksa gambar dengan docker inspectuntuk melihat apakah ada kode sha256 di metadata, tetapi tidak ada (menambahkan kode sha256 gambar mungkin akan mengubah kode sha256).

Apakah saya harus menghitung sendiri kode sha256 dari sebuah gambar dan menggunakannya?

Kristen
sumber
1
Saya membuat masalah di dockerhub terkait dengan ini - github.com/docker/docker/issues/17670
Michael Barton

Jawaban:

88

Jawaban terbaru

Edit yang disarankan oleh OhJeez di komentar.

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

Jawaban asli

Saya yakin Anda juga bisa menggunakan ini

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

Hanya berfungsi di Docker 1.9 dan jika gambar awalnya ditarik oleh intisari. Detail ada di pelacak masalah buruh pelabuhan.

Michael Barton
sumber
7
Gunakan docker inspect --format='{{index .RepoDigests 0}}' $IMAGEtanpa tanda kurung (mengembalikan indeks pertama larik)
OhJeez
@OhJeez, terima kasih saya telah memperbarui jawaban saya dengan saran Anda.
Michael Barton
Setidaknya bagi saya, ini juga berfungsi untuk gambar yang tidak ditarik oleh intisari, tetapi oleh tag. Itu dengan Docker 18.09.7.
sleske
Di bawah Windows, gunakan tanda kutip ganda --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David
81

Anda bisa mendapatkannya 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
sumber
Untuk hanya mendapatkan intisari, Anda juga bisa menggunakan docker images --format '{{.Digest}}'. Ini berguna dalam foreachpernyataan untuk menyelesaikan beberapa pekerjaan dengan intisari.
Mark Loyman
19

Baru saja melihatnya:

Ketika saya menarik gambar, kode sha256 ditampilkan di bagian bawah 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

Kode sha ini

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

dapat digunakan untuk menarik gambar setelahnya dengan

buruh pelabuhan pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

Dengan cara ini Anda dapat yakin bahwa gambar tidak berubah dan dapat digunakan dengan aman untuk produksi.

Kristen
sumber
10
Ini sebenarnya bukan solusi lengkap, karena hanya menangani gambar secara online. Bagaimana jika Anda menginginkan sha256 dari citra lokal?
Zelphir Kaltstahl
19

Cara paling sederhana dan ringkas adalah:

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

Ini hanya mengembalikan sha256:...string dan tidak ada yang lain.

misalnya:

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

Edit:

CATATAN: ini hanya berfungsi untuk gambar lokal. Anda bisa docker pull $IMAGEterlebih dahulu, jika diperlukan.

Greg Bacchus
sumber
7

Selain jawaban yang ada, Anda dapat menggunakan --digestsopsi sambil melakukan docker imagesuntuk mendapatkan daftar intisari untuk semua gambar yang Anda miliki.

docker images --digests

Anda dapat menambahkan grep untuk menelusuri lebih jauh

docker images --digests | grep tomcat
BKC
sumber
5

Seharusnya ini adalah kolom Id, yang bisa Anda lihat di Docker Hub API lama yang sudah tidak digunakan lagi

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

Contoh Respon:

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

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

TAPI: ini bukan cara kerjanya sekarang dengan distribusi buruh pelabuhan baru .
Lihat masalah 628: "Dapatkan ID gambar dengan nama tag"

The /v1/respon registri /repositories/<repo>/tagsdigunakan untuk daftar ID gambar bersama dengan tag pegangan.
/v2/sepertinya hanya memberi pegangan.

Akan berguna untuk mendapatkan ID untuk dibandingkan dengan ID yang ditemukan secara lokal. Satu-satunya tempat saya dapat menemukan ID adalah di v1Compatbagian manifes (yang berlebihan untuk info yang saya inginkan)

Jawaban saat ini (pertengahan 2015) adalah:

Properti V1 API ini sangat mahal secara komputasi untuk cara gambar disimpan di backend. Hanya nama tag yang disebutkan untuk menghindari pencarian sekunder.
Selain itu, V2 API tidak menangani ID Gambar. Sebaliknya, ini menggunakan intisari untuk mengidentifikasi lapisan, yang dapat dihitung sebagai properti lapisan dan dapat diverifikasi secara independen.

VonC
sumber
4

Saya menemukan metode di atas tidak berfungsi dalam beberapa kasus. Mereka juga:

  • tidak menangani banyak gambar dengan hash yang sama (untuk saran .RepoDigests - bila Anda ingin menggunakan jalur registri tertentu)
  • tidak berfungsi dengan baik saat mendorong gambar ke registri (dalam kasus .Id yang merupakan hash lokal, bukan hash di registri).

Metode di bawah ini rumit, tetapi berfungsi untuk mengekstraksi 'nama' dan hash lengkap tertentu untuk container yang didorong tertentu.

Berikut skenarionya - Sebuah gambar diunggah secara terpisah ke 2 proyek berbeda dalam repo yang sama, jadi meminta RepoDigests mengembalikan 2 hasil.

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

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

Saya ingin menggunakan hasil alfa, tetapi saya tidak dapat memprediksi indeksnya. Jadi saya perlu memanipulasi keluaran teks untuk menghapus tanda kurung dan mendapatkan setiap entri pada baris terpisah. Dari situ saya bisa dengan mudah grep hasilnya.

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

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

Seperti yang disebutkan oleh @zelphir, menggunakan intisari bukanlah cara yang baik karena tidak ada untuk gambar khusus lokal. Saya menganggap image ID sha adalah yang paling akurat dan konsisten di seluruh tag / pull / push dll.

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

Apakah triknya.

Kristofer
sumber
2

Anda dapat menemukannya pada saat menarik gambar dari repositori masing-masing. Perintah di bawah ini menyebutkan Digest: sha256 pada saat menarik gambar buruh pelabuhan.

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

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

Setelah gambar diunduh, kita dapat melakukan hal berikut

"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.dll
sumber
1

Keluarkan docker pull tomcat:7-jre8lagi dan Anda akan mendapatkan apa yang Anda inginkan.

petertc
sumber