2014-01-18 44 views
28

我有一個Dockerfile,其中包含執行「apt-get install」的一系列RUN指令;例如,幾行:docker:如何顯示2個圖像之間的差異

RUN apt-get install -y tree 
RUN apt-get install -y git 

已經執行了「泊塢窗建」,如果我再執行「泊塢窗圖像-a」後,我看到所有的基礎 - 兒童孩子的上市-... 。在構建期間創建的圖像。

我想看看執行「apt-get install -y git」這一行時安裝的所有軟件包的列表(包括除git軟件包外還可能安裝的依賴軟件包)。

注:我認爲「泊塢窗diff」命令顯示了一個容器,並從它啓動的圖像之間的差異列表。相反,我想要在兩幅圖像(同一譜系)之間的差異:「樹」和「混帳」圖像ID。這可能嗎?

謝謝。

回答

8

每次運行指令創建一個新的容器,你可以檢查什麼的容器使用docker diff <container>改變。

所以建立你的dockerfile,運行docker ps -a拿到構建文件創建的容器的列表之後。它應該是這個樣子:

CONTAINER ID IMAGE  COMMAND    CREATED  STATUS ... 
53d7dadafee7 f71e394eb0fc /bin/sh -c apt-get i 7 minutes ago Exit 0 ... 
... 

現在你可以做做docker diff 53d7dadafee7看看發生了什麼變化。

+3

感謝這個工程,雖然我不得不使用一個容器,並且它不是理想的:我不能在我的構建中使用-rm選項,或者如果稍後我要清理容器,那麼信息會丟失。它能很好地能夠區分2個相關圖像:「docker diff base_image base_grandchild」 –

10

我想你可以通過docker export CONTAINERIDdocker save IMAGEID同時發送圖片文件系統壓縮包(更新基於評論)

然後用你喜歡的任何工具diff的文件系統 - Git的,RDIFF等

+2

'docker export'以容器ID作爲參數,而不是圖像ID – noisecapella

+3

'docker save'用於圖像 – nponeccop

+0

只是爲了清晰,在你的例子中它應該是'docker export CONTAINER_ID' –

6

如果您知道容器ID或名稱(甚至是停止的容器),則可以快速轉儲文件列表。

$ docker export CONTAIN_ID_OR_NAME | tar tv 
-rwxr-xr-x 0 0  0   0 2 6 21:22 .dockerenv 
-rwxr-xr-x 0 0  0   0 2 6 21:22 .dockerinit 
drwxr-xr-x 0 0  0   0 10 21 13:46 bin/ 
-rwxr-xr-x 0 0  0  1021112 10 8 2014 bin/bash 
-rwxr-xr-x 0 0  0  31152 10 21 2013 bin/bunzip2 
-rwxr-xr-x 0 0  0   0 10 21 2013 bin/bzcat link to bin/bunzip2 
lrwxrwxrwx 0 0  0   0 10 21 2013 bin/bzcmp -> bzdiff 
-rwxr-xr-x 0 0  0  2140 10 21 2013 bin/bzdiff 
lrwxrwxrwx 0 0  0   0 10 21 2013 bin/bzegrep -> bzgrep 
-rwxr-xr-x 0 0  0  4877 10 21 2013 bin/bzexe 
...... 

然後,您可以將列表保存到文件並比較列表文件。

如果你堅持使用圖像ID或名稱,你可以轉儲第一層的文件列表上即時:

$ docker save alpine |tar xO '*/layer.tar' | tar tv 
drwxr-xr-x 0 0  0   0 12 27 06:32 bin/ 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/ash -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/base64 -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/bbconfig -> /bin/busybox 
-rwxr-xr-x 0 0  0  821408 10 27 01:15 bin/busybox 

畢竟,我建議你開始的容器,然後停下來,然後您可以按第一種方式獲取合併文件列表。

2017年2月1日:顯示容器的文件列表中,最快的方式,你可以自由進入它的根目錄讀取文件

# PID=$(docker inspect -f '{{.State.Pid}}' CONTAIN_ID_OR_NAME) 
# cd /proc/$PID/root && ls -lF 
drwxr-xr-x 0 0  0   0 12 27 06:32 bin/ 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/ash -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/base64 -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/bbconfig -> /bin/busybox 
-rwxr-xr-x 0 0  0  821408 10 27 01:15 bin/busybox 

請注意,如果您使用的泊塢窗機,您需要先輸入 docker-machine ssh然後sudo sh

現在你得到兩個容器的根目錄,你可以使用diff直接比較它們。

3

看一看:

https://github.com/moul/docker-diff

他們列出Brew安裝適用於Mac的說明,我假定這是一個bash腳本,所以我認爲它可以做其他的* nix的環境中工作。

+1

好的工具。僅供參考,它基本上運行的容器,導出到壓縮包,並區分文件列表。 – wisbucky

0

看一看:

https://github.com/GoogleCloudPlatform/container-diff

這個工具可以diff的本地或遠程泊塢窗圖像,並且無需泊塢窗將安裝這樣做。它具有文件以及包級別「不同」(例如:apt,npm和pip),以便您可以更輕鬆地查看兩個泊塢窗圖像之間已更改的包裝之間的差異。

免責聲明:我是一個貢獻者,這個項目對我來說

0

這一個工作:

docker run -it e5cba87ecd29 bash -c 'find /path/to/files -type f | sort | xargs -I{} sha512sum {}' > /tmp/dockerfiles.e5cba87ecd29.txt 
docker run -it b1d19fe1a941 bash -c 'find /path/to/files -type f | sort | xargs -I{} sha512sum {}' > /tmp/dockerfiles.b1d19fe1a941.txt 
meld /tmp/dockerfiles* 

凡e5cba87ecd29和b1d19fe1a941是我感興趣的和/路徑圖像/到/文件是目錄可能是「/」。 它列出所有文件,對它進行排序併爲其添加散列以防萬一。而融合突出了所有的差異。