在使用Docker構(gòu)建鏡像時(shí),我們可能會(huì)遇到創(chuàng)建目錄十分緩慢的情況。特別是在構(gòu)建大型鏡像時(shí),這種情況會(huì)更加常見(jiàn)。造成這種問(wèn)題的原因是多方面的,但大多數(shù)情況下都是由于Docker的文件系統(tǒng)引擎導(dǎo)致的。
在Linux系統(tǒng)中,文件系統(tǒng)采用的是ext4或xfs等格式,這種格式在對(duì)少量的小文件進(jìn)行讀寫(xiě)時(shí)十分高效。但是當(dāng)面對(duì)大量的小文件或大文件的時(shí)候,它的性能會(huì)下降。而Docker的文件系統(tǒng)引擎雖然支持ext4和xfs格式,但實(shí)際上使用的是AUFS(Advanced Multi-Layered Unification File System),AUFS本身就是一個(gè)為容器優(yōu)化的文件系統(tǒng)。
那么,如何解決這個(gè)問(wèn)題呢?有以下幾個(gè)解決方法:
1. 統(tǒng)一權(quán)限 在構(gòu)建鏡像時(shí),使用ADD或COPY命令添加文件,可以通過(guò)添加修改文件權(quán)限等操作,導(dǎo)致構(gòu)建鏡像變慢。可以使用docker build時(shí)熟悉的--chown參數(shù)來(lái)指定文件夾的所屬用戶,使得構(gòu)建鏡像的過(guò)程變得更快。 2. 減少文件數(shù)目 在構(gòu)建鏡像時(shí),可以通過(guò)將多個(gè)文件打包成一個(gè)文件(如.tar.gz),減少文件數(shù)量從而提高構(gòu)建的速度。 3. 更新Docker版本 在更新到新版本Docker Engine是AUFS功能被改善,可能會(huì)解決一部分的問(wèn)題。不過(guò),這個(gè)解決方法并不是很靠譜。因?yàn)檫@個(gè)問(wèn)題不一定能夠完全解決。 4. 修改文件系統(tǒng) 如果必須使用Docker,可以嘗試轉(zhuǎn)換文件系統(tǒng)格式,從AUFS轉(zhuǎn)換為overlay2,相對(duì)來(lái)說(shuō),overlay2的性能更高,但是這個(gè)過(guò)程相對(duì)復(fù)雜,需要使用root用戶來(lái)進(jìn)行操作。
總的來(lái)說(shuō),減少文件數(shù)目,標(biāo)準(zhǔn)化權(quán)限和更新Docker版本是比較好的解決方法。但如果這些方法還是無(wú)法解決問(wèn)題,就需要考慮更進(jìn)一步的措施——轉(zhuǎn)換文件系統(tǒng)。