Làm thế nào để xem nội dung hình ảnh docker


291

Tôi đã thực hiện thao tác kéo docker và có thể liệt kê hình ảnh được tải xuống. Tôi muốn xem nội dung của hình ảnh này. Đã tìm kiếm trên mạng nhưng không có câu trả lời thẳng.


2
Bản sao có thể có của Khám phá hệ thống tệp chứa Docker
Vadzim

10
Không phải là một bản dupe. Xem container và hình ảnh không giống nhau. Bạn có thể muốn xem hệ thống tập tin ban đầu hoặc thậm chí xác nhận rằng không có gì độc hại trong hình ảnh trước khi nó có cơ hội chạy.
Keilaron

4
nếu bạn không thể chạy hình ảnh dưới dạng container, bạn có thể sử dụng một công cụ như ổ đĩa ( github.com/wagoodman/dive ) hoặc bạn có thể sử dụng docker save để xuất hình ảnh dưới dạng tệp tar. Sau đó, bạn có thể khám phá tar hoặc với lặn bạn có thể càng sớm khám phá hình ảnh.
FunThomas424242

Không phải là một bản dupe nhưng bạn có thể tìm thấy câu trả lời ở đây: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Câu trả lời:


372

Bạn chỉ có thể chạy một thùng chứa vỏ tương tác bằng hình ảnh đó và khám phá bất kỳ nội dung nào mà hình ảnh đó có.

Ví dụ:

docker run -it image_name sh

Hoặc theo dõi hình ảnh với một entrypoint

docker run -it --entrypoint sh image_name

Hoặc, nếu bạn muốn xem hình ảnh được xây dựng như thế nào, nghĩa là các bước trong nó Dockerfile, bạn có thể:

docker image history --no-trunc image_name > image_history

Các bước sẽ được đăng nhập vào image_historytập tin.


1
Cảm ơn. Đầu tiên là những gì tôi đang tìm kiếm. Về cơ bản khám phá các thư mục.
pylearn

9
Tôi đang cố gắng xem nội dung của một hình ảnh được tạo bằng cách sử dụng "TỪ đầu" và không có vỏ. Có cách nào khác để xem nội dung? Hình ảnh tôi đang cố gắng nhìn thấy là portainer / portainer.
Juan Hernandez

2
Có thể ai đó nhìn thấy nội dung của hình ảnh mà không sinh ra một container? Hoặc chúng ta có thể cho rằng nó an toàn với tất cả mọi người trừ khi họ có quyền sinh ra một container từ nó?
Shabirmean

3
kết hợp những gì đã nói trước "cho một cửa sổ container với điểm vào": docker run -it --entrypoint cmd <image_name>sẽ hoạt động.
Beytan Kurt

2
@JuanHernandez, vâng, bạn có thể kết xuất toàn bộ nội dung của hình ảnh như được chỉ định trong stackoverflow.com/a/42677219/320594 .
Jaime Hablutzel

197

Câu trả lời được chấp nhận ở đây là có vấn đề, bởi vì không có gì đảm bảo rằng một hình ảnh sẽ có bất kỳ loại vỏ tương tác nào. Ví dụ: hình ảnh drone / drone chứa trên một lệnh duy nhất /drone, nó có một ENTRYPOINTlà tốt, vì vậy đây sẽ thất bại:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Và điều này sẽ thất bại:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

Đây không phải là một cấu hình không phổ biến; nhiều hình ảnh tối thiểu chỉ chứa các nhị phân cần thiết để hỗ trợ dịch vụ đích. May mắn thay, có những cơ chế để khám phá một hệ thống tập tin hình ảnh không phụ thuộc vào nội dung của hình ảnh. Đơn giản nhất có lẽ là docker exportlệnh, sẽ xuất một hệ thống tập tin container dưới dạng lưu trữ tar. Vì vậy, hãy khởi động một container (không thành vấn đề nếu nó thất bại hay không):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Sau đó sử dụng docker exportđể xuất hệ thống tập tin sang tar:

$ docker export $(docker ps -lq) | tar tf -

docker ps -lqnghĩa là "cho tôi id của container docker gần đây nhất". Bạn có thể thay thế bằng tên hoặc id container rõ ràng.


5
câu trả lời này rất hữu ích để tìm ra những gì có thể bên trong một container tại một thời điểm nhất định
João Andrade

2
Câu trả lời này đúng hơn và hiệu quả với tôi, vì tôi muốn khám phá nội dung của hình ảnh với kiến ​​trúc nước ngoài và tôi không thể "chạy" nó
Vladimir Perevalov

94

Bạn không nên bắt đầu một container chỉ để xem nội dung hình ảnh. Chẳng hạn, bạn có thể muốn tìm nội dung độc hại, không chạy nó. Sử dụng "tạo" thay vì "chạy";

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$

11
Dòng thứ 2 ở trên chỉ liệt kê nội dung hệ thống tệp. Nếu bạn muốn lấy tất cả các tệp dưới dạng tar, bạn có thể thay thế nó bằng một cái gì đó như docker export tmp_$$ > image-fs.tar.
Pino

Dòng thứ 2 cho HĐH Windows sẽ là gì? Các docker export tmp_$$ | tar tsẽ không hoạt động.
Alexei Marinichenko

@Alexei Marinichenko tarcó thể không được cài đặt trên máy của bạn. Hãy thử tar --helpkiểm tra nó.
Abdurrahman I.

1
Điều này cũng hoạt động nếu không có vỏ trong container
Peter Dotchev

3
@AlexeiMarinichenko bạn có thể sử dụng -otham số để chỉ định tệp cần ghi. Ví dụ docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey

62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Các tập tin sau đây có mặt:

  • manifest.json - Mô tả các lớp hệ thống tệp và tên của tệp json có thuộc tính Container.
  • .json - Thuộc tính container
  • - Mỗi thư mục của lớp layerD chứa các tệp json mô tả thuộc tính lớp và hệ thống tệp được liên kết với lớp đó. Docker lưu trữ hình ảnh Container dưới dạng các lớp để tối ưu hóa không gian lưu trữ bằng cách sử dụng lại các lớp trên hình ảnh.

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

HOẶC LÀ

bạn có thể sử dụng bổ nhào để xem nội dung hình ảnh tương tác với TUI

nhập mô tả hình ảnh ở đây

https://github.com/wagoodman/dive


5
Đây có vẻ là câu trả lời hữu ích nhất đối với tôi, vì bạn không phải bắt đầu một container để lấy các tập tin.
Alec Thomas

1
Hoàn toàn đồng ý @AlecThomas - và để tiến thêm một bước, tại sao tôi thậm chí dockerchỉ cần xem nội dung của, về cơ bản, chỉ là một loại tệp lưu trữ khác.
Ed Randall

câu trả lời hay, tôi cũng sẽ chỉ định thẻ: docker save --output nginx.tar nginx:latestnếu không, theo tài liệu, nó sẽ chứa "tất cả các lớp cha và tất cả các thẻ + phiên bản"
Tarek

Điều này nên được nâng cấp vì đây có lẽ là cách duy nhất để khám phá nội bộ nếu bạn không có bất kỳ tiện ích Unix nào bên trong. Ngoài ra, cách này không yêu cầu tạo ra một container.
Stanislav German-Evtushenko

9

Để liệt kê nội dung chi tiết của một hình ảnh bạn phải chạy docker run --rm image/name ls -alRtrong đó --rmcó nghĩa là loại bỏ ngay khi thoát ra khỏi một container.

nhập mô tả hình ảnh ở đây


11
Điều này giả định rằng hình ảnh đã lscó sẵn và trongPATH
hỗn loạn

6

KHAI THÁC HÌNH ẢNH DOCKER !

  1. Tìm hiểu loại vỏ nào trong đó bashhoặcsh hay ...

    Kiểm tra hình ảnh đầu tiên: docker inspect name-of-container-or-image

    Tìm kiếm entrypointhoặc cmdtrong sự trở lại json.

  2. Sau đó làm: docker run --rm -it --entrypoint=/bin/bash name-of-image

    một khi bên trong làm: ls -lsa hoặc bất kỳ lệnh shell nào khác như:cd ..

    -itviết tắt của tương tác ... và tty. các --rmviết tắt để loại bỏ container sau khi chạy.


1
Vấn đề với câu trả lời này là, như đã thảo luận trong câu trả lời được chấp nhận, không có gì đảm bảo rằng hình ảnh của bạn có bất kỳ vỏ nào trong đó. Hoặc ls. Hoặc thực sự bất kỳ công cụ phổ biến nào cả.
larsks

4

Chúng ta có thể thử một cách đơn giản hơn như sau:

docker image inspect image_id

Điều này làm việc trong phiên bản Docker:

DockerVersion": "18.05.0-ce"

12
Điều này không hiển thị nội dung ; nó chỉ hiển thị các lớp, v.v., đã đi vào việc xây dựng hình ảnh.
Roger Lipscombe

0

Với Docker EE cho Windows (17.06.2-ee-6 trên Hyper-V Server 2016), tất cả nội dung của Windows Container có thể được kiểm tra tại C:\ProgramData\docker\windowsfilter\đường dẫn của HĐH máy chủ.

Không cần gắn đặc biệt.

Tiền tố thư mục có thể được tìm thấy bởi id container từ docker ps -ađầu ra.


-1

Có một công cụ mã nguồn mở miễn phí có tên là Anchore mà bạn có thể sử dụng để quét hình ảnh container. Lệnh này sẽ cho phép bạn liệt kê tất cả các tệp trong một hình ảnh chứa

nội dung hình ảnh neoore-cli myrepo / app: tập tin mới nhất

https://anchore.com/opensource/

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.