簡體   English   中英

如何查看docker圖片內容

[英]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

存在以下文件:

  • manifest.json – 描述文件系統層和具有容器屬性的 json 文件的名稱。
  • .json – 容器屬性
  • – 每個“layerid”目錄包含描述層屬性和與該層關聯的文件系統的 json 文件。 Docker 將容器鏡像存儲為層,通過跨鏡像重用層來優化存儲空間。

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

或者

您可以使用Dive與 TUI 交互地查看圖像內容

在此處輸入圖像描述

https://github.com/wagoodman/dive

探索碼頭形象

  1. 找出里面有什么樣的外殼bashsh ...

首先檢查鏡像: docker inspect name-of-container-or-image

在 JSON 返回中查找entrypointcmd

  1. 然后執行: docker run --rm -it --entrypoint=/bin/bash name-of-image

進入后執行: ls -lsa或任何其他 shell 命令,例如: cd ..

-it代表交互式...和 ​​TTY。 --rm代表運行后刪除容器。

如果沒有lsbash等常用工具,並且您可以訪問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 run --rm image/name ls -alR其中--rm表示從容器退出后立即刪除。

在此處輸入圖像描述

我們可以嘗試一種更簡單的方法,如下所示:

docker image inspect image_id

這在 Docker 版本中有效:

DockerVersion": "18.05.0-ce"

有一個名為 Anchore 的免費開源工具,您可以使用它來掃描容器圖像。 此命令將允許您列出容器映像中的所有文件

anchore-cli 圖像內容 myrepo/app:latest files

https://anchore.com/opensource/

在 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),我想查看它的代碼。

  1. 首先,我們需要將要訪問的 repo 保存為 tar 文件。 在我的情況下,命令就像 - docker save .dkr.ecr.us-east-1.amazonaws.com/<name_of_repo>:image-tag > saved-repo.tar
  2. 使用命令tar -xvf saved-repo.tar 解壓文件。 您可以看到許多文件夾和文件
  3. 現在嘗試查找包含您要查找的代碼的文件(如果您知道代碼的某些部分) 用於搜索文件的命令 - grep -iRl "string you want to search" ./

這將使您到達文件。 甚至該文件也可能被壓縮,因此請使用步驟 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM