[英]How to see docker image contents
我做了一個 docker 拉,可以列出下載的圖像。 我想看看這張圖片的內容。 在 .net 上進行了搜索,但沒有直接的答案。
您可以使用該圖像運行交互式 shell 容器並探索該圖像的任何內容。
例如:
docker run -it image_name sh
或關注帶有entrypoint
的圖像
docker run -it --entrypoint sh image_name
或者,如果您想查看映像是如何構建的,即其Dockerfile
中的步驟,您可以:
docker image history --no-trunc image_name > image_history
這些步驟將記錄到image_history
文件中。
這里接受的答案是有問題的,因為不能保證圖像將具有任何類型的交互式外殼。 例如, drone/drone圖像包含在單個命令/drone
中,並且它也有一個ENTRYPOINT
,所以這將失敗:
$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured
這將失敗:
$ 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".
這不是不常見的配置; 許多最小映像僅包含支持目標服務所需的二進制文件。 幸運的是,有一些機制可以探索不依賴於圖像內容的圖像文件系統。 最簡單的可能是docker export
命令,它將容器文件系統導出為 tar 存檔。 所以,啟動一個容器(不管它是否失敗):
$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured
然后使用docker export
將文件系統導出到tar
:
$ docker export $(docker ps -lq) | tar tf -
docker ps -lq
那里的意思是“給我最近的 docker 容器的 id”。 您可以將其替換為明確的容器名稱或 ID。
您不應該僅僅為了查看圖像內容而啟動容器。 例如,您可能想要查找惡意內容,而不是運行它。 使用“創建”而不是“運行”;
docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
docker save nginx > nginx.tar
tar -xvf nginx.tar
存在以下文件:
https://sreeinet.wordpress.com/2016/06/11/looking-inside-container-images/
或者
您可以使用Dive與 TUI 交互地查看圖像內容
探索碼頭形象!
bash
或sh
... 首先檢查鏡像: docker inspect name-of-container-or-image
在 JSON 返回中查找entrypoint
或cmd
。
docker run --rm -it --entrypoint=/bin/bash name-of-image
進入后執行: ls -lsa
或任何其他 shell 命令,例如: cd ..
-it
代表交互式...和 TTY。 --rm
代表運行后刪除容器。
如果沒有ls
或bash
等常用工具,並且您可以訪問Dockerfile
,只需將常用工具添加為層。
示例(高山 Linux):
RUN apk add --no-cache bash
當您無權訪問Dockerfile
時,只需從新創建的容器中復制/提取文件並查看它們:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
我們可以嘗試一種更簡單的方法,如下所示:
docker image inspect image_id
這在 Docker 版本中有效:
DockerVersion": "18.05.0-ce"
有一個名為 Anchore 的免費開源工具,您可以使用它來掃描容器圖像。 此命令將允許您列出容器映像中的所有文件
anchore-cli 圖像內容 myrepo/app:latest files
在 Commandeer 是一款付費應用程序中,您可以在側面導航樹視圖中遍歷文件,然后單擊文件進行預覽。您可以在下面看到這樣的示例。
您可以在文檔頁面上閱讀有關此功能的更多信息 - https://docs.getcommandeer.com/docs/Docker/viewing-your-files-in-a-docker-container/
這對我有用。!
在 Linux 上,假設vibrant_banach
鏡像在一個容器中運行,名為vibrant_banach
,您可以使用 -
docker exec -it vibrant_banach bash
這將打開一個 bash shell,您可以在其中使用ls
查看您的文件。
也許這不是一種非常直接的方法,但這個方法對我有用。 我有一個 ECR Repo(Amazon Container Service Repository),我想查看它的代碼。
這將使您到達文件。 甚至該文件也可能被壓縮,因此請使用步驟 2 中提到的命令將其解壓縮。
如果您不知道要搜索的代碼,則需要檢查在第 2 步之后獲得的所有文件,這可能會有點累人。
一切順利 !
如果你想在不運行的情況下檢查圖像內容,你可以這樣做:
$ sudo bash
...
$ cd /var/lib/docker # default path in most installations
$ find . -iname a_file_inside_the_image.ext
... (will find the base path here)
這適用於當前默認的 BTRFS 存儲驅動程序。
如果要在不啟動容器的情況下列出圖像中的文件:
docker create --name listfiles <image name>
docker export listfiles | tar -t
docker rm listfiles
Oneliner,沒有 docker 運行(基於上述響應)
IMAGE=your_image docker create --name filelist $IMAGE command && docker export filelist | tar tf - | tree --fromfile . && docker rm filelist
相同,但將樹結構報告給 result.txt
IMAGE=analytics_artifacts docker create --name filelist $IMAGE command && docker export filelist | tar tf - | tree --noreport --fromfile . | tee result.txt && docker rm filelist
我嘗試了這個工具 - https://github.com/wagoodman/dive我發現它對探索 docker 圖片的內容很有幫助。
使用 Docker EE for Windows(Hyper-V Server 2016 上的 17.06.2-ee-6)可以在主機操作系統的C:\ProgramData\docker\windowsfilter\
路徑中檢查 Windows 容器的所有內容。
無需特殊安裝。
文件夾前綴可以通過docker ps -a
輸出中的容器 id 找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.