這篇文章主要講解了“Dockerfile有什么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Dockerfile有什么用”吧!
Docker使用層layer創建鏡像,Dockerfile中每一個命令都會創建一個新的層,每層都包含執行命令前后的狀態之間鏡像的文件系統更改。
為了加快構建速度,Docker實現了緩存:
如果Dockerfile和相關文件未更改,則重建(rebuild)時可以重用本地鏡像緩存中的某些現有層。
但是,為了利用此緩存,您需要了解它的工作方式,這就是我們將在本文中介紹的內容。
當您構建Dockerfile時,Docker將查看它是否可以使用先前構建的緩存結果:
我們來看一個使用以下Dockerfile的示例:
FROM python:3.7-slim-buster
COPY . .
RUN pip install --quiet -r requirements.txt
ENTRYPOINT ["python", "server.py"]
第一次運行時,所有命令都會運行:
$ docker build -t example1 .
Sending build context to Docker daemon 5.12kB
Step 1/4 : FROM python:3.7-slim-buster
---> f96c28b7013f
Step 2/4 : COPY . .
---> eff791eb839d
Step 3/4 : RUN pip install --quiet -r requirements.txt
---> Running in 591f97f47b6e
Removing intermediate container 591f97f47b6e
---> 02c7cf5a3d9a
Step 4/4 : ENTRYPOINT ["python", "server.py"]
---> Running in e3cf483c3381
Removing intermediate container e3cf483c3381
---> 598b0340cc90
Successfully built 598b0340cc90
Successfully tagged example1:latest
第二次構建時,因為沒有任何改變,docker構建將使用鏡像緩存:
$ docker build -t example1 .
Sending build context to Docker daemon 5.12kB
Step 1/4 : FROM python:3.7-slim-buster
---> f96c28b7013f
Step 2/4 : COPY . .
---> Using cache
---> eff791eb839d
Step 3/4 : RUN pip install --quiet -r requirements.txt
---> Using cache
---> 02c7cf5a3d9a
Step 4/4 : ENTRYPOINT ["python", "server.py"]
---> Using cache
---> 598b0340cc90
Successfully built 598b0340cc90
Successfully tagged example1:latest
請注意,上面顯示的Using cache加快了構建速度(無需從網絡下載任何pip依賴包)
如果我們刪除鏡像,則后續構建將從頭開始(沒有層緩存了):
$ docker image rm example1
Untagged: example1:latest
Deleted: sha256:598b0340cc90967501c5c51862dc586ca69a01ca465f48232fc457d3ab122a73
Deleted: sha256:02c7cf5a3d9af1939b9f5286312b23898fd3ea12b7cb1d7a77251251740a806c
Deleted: sha256:d9e9602d9c3fd7381a8e1de301dc4345be2eb2b8488b5fc3e190eaacbb2f9596
Deleted: sha256:eff791eb839d00cbf46d139d8595b23867bc580bb9164b90253d0b2d9fcca236
Deleted: sha256:53d34b2ead0a465d229a4260fee2a845fb8551856d4019cd2e608dfe0e039e77
$ docker build -t example1 .
Sending build context to Docker daemon 5.12kB
Step 1/4 : FROM python:3.7-slim-buster
---> f96c28b7013f
Step 2/4 : COPY . .
---> 63c32b9b1af6
...
緩存算法還有一個更重要的規則:
在以下示例中,前后兩次構建過程的C層均未更改,盡管如此,由于上層并不是從層緩存中加載,因此后置的C層仍然無法從緩存中加載:
層緩存對下面的Dockerfile意味著什么?
FROM python:3.7-slim-buster
COPY requirements.txt .
COPY server.py .
RUN pip install --quiet -r requirements.txt
ENTRYPOINT ["python", "server.py"]
如果COPY命令的任何文件改變了,則會使后續所有層緩存失效:我們需要重新運行pip install (這一層若不走緩存,通常耗時久)。
但是,如果requirements.txt沒有更改 & server.py更改了,為什么我們必須重做pip安裝?畢竟,pip安裝僅使用requirements.txt。
“推及到現代編程語言:前端的依賴包文件paakcage.json, dotnet的項目管理文件dotnetdemo.csproj等,一般很少變更;隨時變動的業務代碼,導致后續的層緩存失效(后續層每次都要重新下載&安裝依賴)。
因此,您要做的是僅復制實際需要運行下一步的那些文件,以最大程度地減少緩存失效的機會。
FROM python:3.7-slim-buster
COPY requirements.txt .
RUN pip install --quiet -r requirements.txt
COPY server.py .
ENTRYPOINT ["python", "server.py"]
由于server.py僅在pip安裝后才復制到構建上下文,因此,只要requirements.txt不變,仍然可以從緩存加載由上次pip安裝創建的層。
如果您想通過重用之前緩存的層來進行快速構建,則需要適當地編寫Dockerfile:
感謝各位的閱讀,以上就是“Dockerfile有什么用”的內容了,經過本文的學習后,相信大家對Dockerfile有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。