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