Tôi có thể tìm mã sha256 của hình ảnh docker ở đâu?


91

Tôi muốn lấy hình ảnh của centos, tomcat, ... bằng cách sử dụng mã sha256 của chúng, như trong

docker pull myimage@sha256:0ecb2ad60

nhưng tôi không thể tìm thấy mã sha256 để sử dụng ở bất kỳ đâu.

Tôi đã kiểm tra kho lưu trữ dockerhub để tìm bất kỳ gợi ý nào về mã sha256, nhưng không tìm thấy bất kỳ gợi ý nào. Tôi đã tải xuống các hình ảnh theo thẻ của họ

docker pull tomcat:7-jre8

và kiểm tra hình ảnh với docker inspectđể xem liệu có mã sha256 trong siêu dữ liệu hay không, nhưng không có mã nào (thêm mã sha256 của hình ảnh có thể sẽ thay đổi mã sha256).

Tôi có phải tự mình tính toán mã sha256 của hình ảnh và sử dụng mã đó không?


1
Tôi đã tạo sự cố trên dockerhub liên quan đến vấn đề này - github.com/docker/docker/issues/17670
Michael Barton

Câu trả lời:


89

Câu trả lời mới nhất

Chỉnh sửa do OhJeez đề xuất trong phần bình luận.

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

Câu trả lời ban đầu

Tôi tin rằng bạn cũng có thể nhận được điều này bằng cách sử dụng

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

Chỉ hoạt động trong Docker 1.9 và nếu hình ảnh ban đầu được kéo bởi thông báo. Thông tin chi tiết có trên trình theo dõi vấn đề của docker.


7
Sử dụng docker inspect --format='{{index .RepoDigests 0}}' $IMAGEmà không có dấu ngoặc (trả về chỉ số đầu tiên của mảng)
OhJeez

@OhJeez, cảm ơn, tôi đã cập nhật câu trả lời của mình với đề xuất của bạn.
Michael Barton

Ít nhất đối với tôi, điều này cũng hoạt động đối với các hình ảnh không được kéo bởi thông báo mà bằng thẻ. Đó là với Docker 18.09.7.
sleske

Trong Windows, vui lòng sử dụng dấu ngoặc kép --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David

81

Bạn có thể lấy nó bằng cách 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

Để chỉ nhận được thông báo, bạn cũng có thể sử dụng docker images --format '{{.Digest}}'. Điều này hữu ích trong một foreachtuyên bố để hoàn thành một số công việc với các tiêu chuẩn.
Mark Loyman

19

Chỉ cần nhìn thấy nó:

Khi tôi kéo một hình ảnh, mã sha256 được hiển thị ở cuối đầu ra (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

Mã sha này

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

có thể được sử dụng để kéo hình ảnh sau đó với

docker pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

Bằng cách này, bạn có thể chắc chắn rằng hình ảnh không bị thay đổi và có thể được sử dụng một cách an toàn để sản xuất.


10
Đây không thực sự là một giải pháp hoàn chỉnh, vì nó chỉ xử lý hình ảnh trực tuyến. Nếu bạn muốn sha256 của một hình ảnh cục bộ thì sao?
Zelphir Kaltstahl

19

Cách đơn giản và ngắn gọn nhất là:

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

Điều này chỉ trả về sha256:...chuỗi và không có gì khác.

ví dụ:

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

Biên tập:

LƯU Ý: điều này chỉ hoạt động đối với hình ảnh cục bộ. Bạn có thể docker pull $IMAGEtrước, nếu được yêu cầu.


7

Ngoài các câu trả lời hiện có, bạn có thể sử dụng --digeststùy chọn trong khi thực hiện docker imagesđể nhận danh sách thông báo cho tất cả các hình ảnh bạn có.

docker images --digests

Bạn có thể thêm một grep để xem chi tiết

docker images --digests | grep tomcat

5

Đây phải là trường Id mà bạn có thể thấy trong API trung tâm Dockerkhông được dùng nữa

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

Phản hồi ví dụ:

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

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

NHƯNG: đây không phải là cách nó hiện đang hoạt động với bản phân phối docker mới .
Xem vấn đề 628: "Nhận ID hình ảnh với tên thẻ"

Các /v1/phản ứng registry /repositories/<repo>/tagssử dụng để liệt kê các ID hình ảnh cùng với các thẻ xử lý.
/v2/chỉ dường như để cung cấp cho các xử lý.

Sẽ rất hữu ích nếu lấy ID để so sánh với ID được tìm thấy tại địa phương. Nơi duy nhất tôi có thể tìm thấy ID là trong v1Compatphần của tệp kê khai (quá mức cần thiết cho thông tin tôi muốn)

Câu trả lời hiện tại (giữa năm 2015) là:

Thuộc tính này của V1 API rất tốn kém về mặt tính toán đối với cách hình ảnh được lưu trữ trên chương trình phụ trợ. Chỉ các tên thẻ được liệt kê để tránh tra cứu phụ.
Ngoài ra, API V2 không xử lý ID hình ảnh. Thay vào đó, nó sử dụng các tiêu chuẩn để xác định các lớp, có thể được tính là thuộc tính của lớp và có thể xác minh độc lập.


4

Tôi thấy các phương pháp trên không hoạt động trong một số trường hợp. Họ hoặc:

  • không xử lý tốt với nhiều hình ảnh có cùng một hàm băm (trong trường hợp đề xuất .RepoDigests - khi bạn muốn sử dụng một đường dẫn đăng ký cụ thể)
  • không hoạt động tốt khi đẩy hình ảnh vào sổ đăng ký (trong trường hợp .Id là hàm băm cục bộ, không phải hàm băm trong sổ đăng ký).

Phương pháp dưới đây là tinh tế, nhưng hoạt động để trích xuất 'tên' và hàm băm cụ thể cho một vùng chứa được đẩy cụ thể.

Đây là tình huống - Một hình ảnh được tải lên riêng biệt cho 2 dự án khác nhau trong cùng một repo, do đó, truy vấn RepoDigests trả về 2 kết quả.

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

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

Tôi muốn sử dụng kết quả alpha, nhưng tôi không thể dự đoán nó sẽ là chỉ mục nào. Vì vậy, tôi cần phải thao tác đầu ra văn bản để loại bỏ dấu ngoặc và nhận mỗi mục nhập trên một dòng riêng biệt. Từ đó tôi có thể dễ dàng thu thập kết quả.

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

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 

3

Như đã đề cập bởi @zelphir, sử dụng thông báo không phải là một cách tốt vì nó không tồn tại cho hình ảnh cục bộ. Tôi giả định rằng ID hình ảnh là chính xác và nhất quán nhất trên các thẻ / kéo / đẩy, v.v.

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

Có lừa.


2

Bạn có thể tìm thấy nó tại thời điểm kéo hình ảnh từ kho lưu trữ tương ứng. Lệnh dưới đây đề cập đến Digest: sha256 tại thời điểm kéo hình ảnh docker.

09:33 AM ## ~ ::> docker --version Docker phiên bản 19.03.4, bản dựng 9013bf5

Số: 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

Sau khi hình ảnh được tải xuống, chúng ta có thể làm như sau

"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

Chỉ cần phát hành docker pull tomcat:7-jre8lại và bạn sẽ nhận được những gì bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.