日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

掌握了Docker Layer Caching才敢自称精通Dockerfile

發布時間:2023/12/4 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 掌握了Docker Layer Caching才敢自称精通Dockerfile 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

長話短說:本次原創將向您展示在Docker中使用Layer Cache以加快鏡像構建。

這個話題的初衷在于:應用打包過程是很慢的(下載并安裝框架&第三方依賴包、生成assets),這個過程在Docker中也不能避免。

About Layer Caching ?in Docker

Docker使用層layer創建鏡像,Dockerfile中每一個命令都會創建一個新的層,每層都包含執行命令前后的狀態之間鏡像的文件系統更改。

為了加快構建速度,Docker實現了緩存:
如果Dockerfile和相關文件未更改,則重建(rebuild)時可以重用本地鏡像緩存中的某些現有層。
但是,為了利用此緩存,您需要了解它的工作方式,這就是我們將在本文中介紹的內容。

The basic algorithm

當您構建Dockerfile時,Docker將查看它是否可以使用先前構建的緩存結果:

  • 對于大多數命令,如果命令文本未更改,則將使用緩存中的版本。

  • 對于COPY,它還會檢查您要復制的文件是否未更改。

我們來看一個使用以下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 ...

Taking advantage of caching

緩存算法還有一個更重要的規則:

  • 如果某層無法應用層緩存,則后續層都不能從層緩存加載

在以下示例中,前后兩次構建過程的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安裝創建的層。

Designing your Dockerfile for caching

如果您想通過重用之前緩存的層來進行快速構建,則需要適當地編寫Dockerfile:

  • 僅復制下一步所需的文件,以最大程度地減少構建過程中的緩存失效。

  • 盡量將文件可能變更的新增(ADD命令)、拷貝(COPY命令) 延遲到Dockerfile的后部。

“閱讀全文,體驗更佳”

總結

以上是生活随笔為你收集整理的掌握了Docker Layer Caching才敢自称精通Dockerfile的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。