網(wǎng)站開發(fā)技術(shù)項(xiàng)目北京seo相關(guān)
Docker鏡像的分層結(jié)構(gòu)
- Docker鏡像是由一層一層的文件系統(tǒng)組成,UnionFS將這些鏡像層堆疊在一起
- 鏡像層是只讀的,構(gòu)建完成后就不能更改了,即使在新的鏡像層修改或刪除了某些文件,也不會影響之前的鏡像層內(nèi)容
- 用Dockerfile構(gòu)建鏡像時(shí),每個(gè)指令都會創(chuàng)建一個(gè)新的鏡像層,鏡像層會被緩存和復(fù)用
構(gòu)建緩存的基本規(guī)則
構(gòu)建鏡像時(shí),Docker 按照順序逐步執(zhí)行 Dockerfile 中的指令。對于每條指令,Docker 檢查它是否可以重用構(gòu)建緩存中的指令。
- 如果引用的父鏡像在構(gòu)建緩存中,下一個(gè)指令將會和所有從該基礎(chǔ)鏡像派生的子鏡像做比較,如果和其中一個(gè)子鏡像的指令相同,那么緩存命中,否則緩存失效
- 在大部分情況下,通過比較Dockerfile中的指令和子鏡像已經(jīng)足夠了,但是有些指令需要進(jìn)一步的檢查
- 對于ADD和COPY指令,文件的內(nèi)容會被檢查,并且會計(jì)算每一個(gè)文件的校驗(yàn)碼。在緩存查找期間,如果文件內(nèi)容或元數(shù)據(jù)發(fā)生更改,那么緩存就會失效
- 除了ADD和COPY指令之外,緩存檢查不會查看容器中的文件來判斷是否命中緩存。例如,在處理RUN apt-get -y update指令時(shí),不會檢查容器中的更新文件來確定是否命中緩存,這種情況下只會檢查指定字符串是否相同
一旦緩存失效,所有后續(xù)的 Dockerfile 指令都會生成新的鏡像層,不再使用緩存。
如何充分利用緩存
- 將多個(gè)命令合并成單個(gè)RUN指令時(shí),同時(shí)也要考慮將變更頻率不同的命令分開
- 指令從變更不頻繁到變更頻繁的順序來寫
a. 一般源代碼會經(jīng)常變化,所以要把安裝依賴等不經(jīng)常變動的步驟寫在前面,拷貝源代碼等經(jīng)常變動的步驟寫在后面
b.如果是Python項(xiàng)目的話,先拷貝requerements.txt,然后進(jìn)行pip install requerements.txt,最后再進(jìn)行COPY代碼 - ARG指令的變量值變化會導(dǎo)致緩存失效,所以最好在使用前定義,不要過早使用
參考
https://docs.docker.com/develop/develop-images/guidelines/#leverage-build-cache