ฉันจะหารหัส sha256 ของอิมเมจนักเทียบท่าได้ที่ไหน


94

ฉันต้องการดึงภาพของ CentOS, Tomcat, ... โดยใช้รหัส sha256 เช่นใน

docker pull myimage@sha256:0ecb2ad60

แต่ฉันไม่พบ sha256-code ที่จะใช้ที่ไหนเลย

ฉันตรวจสอบที่เก็บ DockerHub เพื่อดูคำใบ้ของรหัส sha256 แต่ไม่พบเลย ฉันดาวน์โหลดภาพตามแท็ก

docker pull tomcat:7-jre8

และตรวจสอบภาพด้วยdocker inspectเพื่อดูว่ามีรหัส sha256 ในข้อมูลเมตาหรือไม่ แต่ไม่มีเลย (การเพิ่มรหัส sha256 ของรูปภาพอาจเปลี่ยนรหัส sha256)

ฉันต้องคำนวณรหัส sha256 ของรูปภาพด้วยตัวเองและใช้สิ่งนั้นหรือไม่


1
ฉันสร้างปัญหาบน Dockerhub ที่เกี่ยวข้องกับสิ่งนี้ - github.com/docker/docker/issues/17670
Michael Barton

คำตอบ:


96

คำตอบล่าสุด

แก้ไขแนะนำโดย OhJeez ในความคิดเห็น

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

คำตอบเดิม

ฉันเชื่อว่าคุณสามารถใช้สิ่งนี้ได้

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

ใช้งานได้เฉพาะใน Docker 1.9 และหากเดิมดึงภาพโดยไดเจสต์ รายละเอียดอยู่ในเครื่องมือติดตามปัญหานักเทียบท่า


8
ใช้docker inspect --format='{{index .RepoDigests 0}}' $IMAGEสำหรับไม่มีวงเล็บปีกกา (ส่งกลับดัชนีแรกของอาร์เรย์)
OhJeez

@OhJeez ขอบคุณฉันได้อัปเดตคำตอบพร้อมข้อเสนอแนะของคุณ
Michael Barton

อย่างน้อยสำหรับฉันสิ่งนี้ยังใช้ได้กับรูปภาพที่ไม่ได้ดึงโดยไดเจสต์ แต่มาจากแท็ก นั่นคือ Docker 18.09.7
sleske

ใน Windows โปรดใช้เครื่องหมายคำพูดคู่ --format = "... " ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David

หลังจากอ่านโพสต์นี้แล้วใคร ๆ ก็อยากดูโพสต์ด้านล่างนี้เช่นกัน stackoverflow.com/questions/56364643/…
vaibhavnd

85

คุณสามารถรับได้โดย 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
docker images --format '{{.Digest}}'จะได้รับเพียงย่อยนอกจากนี้คุณยังสามารถใช้ สิ่งนี้มีประโยชน์ในการใช้foreachคำสั่งเพื่อทำงานบางอย่างกับไดเจสต์
Mark Loyman

22

วิธีที่ง่ายและรัดกุมที่สุดคือ:

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

สิ่งนี้ส่งคืนเฉพาะsha256:...สตริงและไม่มีอะไรอื่น

เช่น:

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

แก้ไข:

หมายเหตุ: ใช้ได้กับภาพที่อยู่ในเครื่องเท่านั้น ก่อนอื่นคุณสามารถทำได้docker pull $IMAGEหากจำเป็น


19

เพิ่งเห็น:

เมื่อฉันดึงรูปภาพโค้ด sha256 จะถูกวางไว้ที่ด้านล่างของผลลัพธ์ (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

รหัส sha นี้

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

สามารถใช้ดึงภาพในภายหลังด้วย

นักเทียบท่าดึงทอมแคท @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

วิธีนี้จะทำให้คุณมั่นใจได้ว่ารูปภาพจะไม่เปลี่ยนแปลงและสามารถนำไปใช้ในการผลิตได้อย่างปลอดภัย


10
นี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์จริง ๆ เนื่องจากใช้กับรูปภาพออนไลน์เท่านั้น จะเกิดอะไรขึ้นถ้าคุณต้องการ sha256 ของภาพท้องถิ่น?
Zelphir Kaltstahl

7

นอกเหนือจากคำตอบที่มีอยู่แล้วคุณสามารถใช้--digestsตัวเลือกในขณะที่ทำdocker imagesเพื่อรับรายการไดเจสต์สำหรับรูปภาพทั้งหมดที่คุณมี

docker images --digests

คุณสามารถเพิ่ม grep เพื่อดูรายละเอียดเพิ่มเติมได้

docker images --digests | grep tomcat

5

นี่ควรเป็นฟิลด์ Id ที่คุณเห็นในDocker Hub API แบบเก่าที่เลิกใช้แล้ว

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

ตัวอย่างการตอบสนอง:

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

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

แต่นี่คือไม่ได้ว่ามันคือการทำงานตอนนี้มีการกระจายนักเทียบท่าใหม่
ดูฉบับที่ 628: "รับรหัสภาพพร้อมชื่อแท็ก"

การ/v1/ตอบสนองของรีจิสทรีที่/repositories/<repo>/tagsใช้เพื่อแสดง ID รูปภาพพร้อมกับที่จับแท็ก
/v2/ดูเหมือนจะให้ที่จับเท่านั้น

จะมีประโยชน์ในการรับ ID เพื่อเปรียบเทียบกับ ID ที่พบในเครื่อง ที่เดียวที่ฉันสามารถหา ID ได้คือในv1Compatส่วนของไฟล์ Manifest (ซึ่งเกินความจำเป็นสำหรับข้อมูลที่ฉันต้องการ)

คำตอบปัจจุบัน (กลางปี ​​2015) คือ:

คุณสมบัติของ V1 API นี้มีราคาแพงมากสำหรับวิธีจัดเก็บรูปภาพในแบ็กเอนด์ มีการระบุเฉพาะชื่อแท็กเพื่อหลีกเลี่ยงการค้นหารอง
นอกจากนี้ V2 API ไม่จัดการในรหัสรูปภาพ แต่จะใช้ไดเจสต์ในการระบุเลเยอร์ซึ่งสามารถคำนวณเป็นคุณสมบัติของเลเยอร์และสามารถตรวจสอบได้อย่างอิสระ


4

ฉันพบว่าวิธีการข้างต้นไม่ได้ผลในบางกรณี พวกเขาทั้ง:

  • ไม่จัดการกับภาพหลายภาพที่มีแฮชเดียวกัน (ในกรณีของคำแนะนำ. RepoDigests - เมื่อคุณต้องการใช้เส้นทางรีจิสทรีเฉพาะ)
  • ทำงานได้ไม่ดีเมื่อผลักรูปภาพไปยังรีจิสเตอร์ (ในกรณีของ. ID ที่เป็นแฮชในเครื่องไม่ใช่แฮชในรีจิสตรี)

วิธีการด้านล่างนี้มีความละเอียดอ่อน แต่ใช้ได้กับการแยก 'ชื่อ' และแฮชแบบเต็มเฉพาะสำหรับคอนเทนเนอร์แบบผลักเฉพาะ

นี่คือสถานการณ์ - รูปภาพถูกอัปโหลดแยกกันไปยัง 2 โปรเจ็กต์ที่แตกต่างกันใน repo เดียวกันดังนั้นการค้นหา RepoDigests จะให้ผลลัพธ์ 2 รายการ

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

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

ฉันต้องการใช้ผลลัพธ์อัลฟ่า แต่ไม่สามารถคาดเดาได้ว่าจะเป็นดัชนีใด ดังนั้นฉันต้องจัดการเอาต์พุตข้อความเพื่อลบวงเล็บและรับแต่ละรายการในบรรทัดแยกกัน จากตรงนั้นฉันสามารถ grep ผลลัพธ์ได้อย่างง่ายดาย

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

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 

3

ดังที่ได้กล่าวไว้โดย @zelphir การใช้ไดเจสต์ไม่ใช่วิธีที่ดีเนื่องจากไม่มีอยู่สำหรับรูปภาพในเครื่องเท่านั้น ฉันคิดว่ารหัสรูปภาพ sha นั้นแม่นยำและสอดคล้องกันที่สุดในแท็ก / ดึง / พุชเป็นต้น

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

เคล็ดลับไม่


2

คุณสามารถค้นหาได้เมื่อดึงรูปภาพจากที่เก็บตามลำดับ คำสั่งด้านล่างกล่าวถึง Digest: sha256 ในขณะที่ดึงอิมเมจนักเทียบท่า

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

ไดเจสต์: 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

เมื่อดาวน์โหลดภาพแล้วเราสามารถดำเนินการดังต่อไปนี้

"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

เพียงแค่ออกdocker pull tomcat:7-jre8อีกครั้งและคุณจะได้รับสิ่งที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.