谷歌發布了一個叫作container-diff的工具,用于分析比對Docker鏡像。它支持文件系統比對,并能夠感知到由apt、npm和pip這些包管理器所帶來的變更。
Dockerfile用于創建容器鏡像,一旦Dockerfile發生變更,就需要重新創建新的鏡像。Dockerfile是普通的文本文件,使用源碼控制系統的diff工具就可以比較出它們之間的區別。不過,要對Dockerfile文件里的命令所產生的鏡像變更記進行可視化,或者列出具體的鏡像變更內容就很困難。應用程序被打包到鏡像之后,如果依賴了第三方特定版本的依賴項,事情就會變得復雜,況且,下游的依賴項也會讓跟蹤變得更加復雜。未被跟蹤的依賴項會導致鏡像體積膨脹,讓鏡像下載時間變長。
container-diff會分析鏡像的“語義”差別,將結果以一種用戶可理解的格式呈現給用戶,這樣用戶就可以采取相應的行動。container-diff支持Python的pip包管理器、Linux上的apt工具以及node.js包管理器npm。另外,它還可以用于分析文件系統的變化。該工具可以一次性分析一個或幾個甚至所有包管理器的內容。
在分析鏡像時,可以指定本地的Docker后臺路徑、遠程的鏡像倉庫地址或文件路徑。如果已經使用Docker的保存命令導出鏡像,那么可以使用后者。在使用該工具分析后臺鏡像時,鏡像不需要處于運行狀態。該工具還能輸出單個鏡像的修改歷史。
其他類似的工具還有Anchore的diff工具以及Atomic項目的“atomic diff”命令。Docker的“docker history”命令只能列出每個Dockerfile的變更歷史,這個只需要檢查一下Dockerfile就知道了。一些反向工程可以揭示底層的一些細節,但很難將其抽取成事件,比如之前安裝了哪些包。Atomic的工具可以列出文件系統的差別,而且可以用在RPM上,也就是說,它可以列出安裝了哪些RPM包。另外,“atomic diff”命令可以用于比較兩個容器、容器和鏡像、兩個鏡像之間的差別。
根據谷歌的文章所述,container-diff可以成為開發流程的一部分,可以與持續集成系統集成起來,提供自動化的變更日志管理,而且它的輸出結果是JSON格式的。如果鏡像處于倉庫當中,不管是私有倉庫還是像Google Container Registry這樣的倉庫,container-diff都為它們提供了認證機制,這個認證機制是通過docker-credentials-helpers包來實現的。這個包使用本地程序(比如OSX上的osxkeychain)來保存Docker認證信息。
查看英文原文:container-diff - an Open Source Tool from Google for Analyzing Differences Between Docker Images