在沒(méi)有Docker緩存的情況下構(gòu)建鏡像的方法分享
盡可能快地構(gòu)建 Docker 鏡像至關(guān)重要。構(gòu)建映像的速度越快,測(cè)試并將其部署到生產(chǎn)環(huán)境的速度就越快。Docker 的構(gòu)建緩存是通過(guò)重用以前構(gòu)建的層來(lái)加速構(gòu)建的好方法。
Docker 緩存的工作原理
Docker 構(gòu)建緩存最好被視為從 Dockerfile 頂部到底部的堆棧。給定這樣的 Dockerfile:
FROM node:16 RUN apt-get update && apt-get install -y curl WORKDIR /app COPY package.json package-lock.json /app/ RUN npm install COPY . . RUN npm build
Dockerfile中的每一行都是Docker鏡像構(gòu)建過(guò)程中的一步,會(huì)在鏡像中創(chuàng)建一個(gè)層。這些層從上到下堆疊,形成最終的Docker鏡像。
這種繼承關(guān)系構(gòu)成了Docker層緩存的骨架。當(dāng)你使用docker build
命令構(gòu)建鏡像時(shí),Docker會(huì)按照從上到下的順序執(zhí)行每一步。在執(zhí)行每個(gè)步驟時(shí),它會(huì)檢查是否已經(jīng)有了該步驟的層。如果該步驟自上次構(gòu)建以來(lái)沒(méi)有改變,緩存中就已經(jīng)存在該層,不需要重新構(gòu)建。
如果該步驟已經(jīng)改變(例如我們?cè)?code>COPY . .中更改了源代碼),層緩存中就沒(méi)有匹配項(xiàng),需要重新構(gòu)建該步驟。
如果你已經(jīng)清除了本地Docker層緩存,該步驟也可能不在緩存中存在。
在docker build
過(guò)程中使用層緩存,是為什么步驟的順序非常重要。如果你更改了某個(gè)步驟,所有位于該步驟下方的步驟都需要重新構(gòu)建。
使用以下命令構(gòu)建沒(méi)有緩存的鏡像--no-cache
但是,有時(shí),您想要構(gòu)建沒(méi)有緩存的圖像。您可能正在調(diào)試構(gòu)建問(wèn)題并希望從頭開(kāi)始?;蛘吣赡芟霃?qiáng)制升級(jí)依賴項(xiàng)。無(wú)論出于何種原因,您都可以使用該選項(xiàng)構(gòu)建沒(méi)有緩存的圖像--no-cache
。
docker build --no-cache .
該標(biāo)志告訴 Docker 守護(hù)進(jìn)程在 a 期間跳過(guò)緩存docker build
并運(yùn)行 Dockerfile 中的每個(gè)步驟。它會(huì)導(dǎo)致構(gòu)建速度變慢,但會(huì)確保您運(yùn)行每一步。指定--no-cache
有助于調(diào)試構(gòu)建問(wèn)題。您還可以使用它來(lái)強(qiáng)制升級(jí)依賴項(xiàng),就像curl
上面一樣apt-get install
。
該參數(shù)告訴Docker守護(hù)進(jìn)程在docker build
期間跳過(guò)緩存,并運(yùn)行Dockerfile中的每個(gè)步驟。這會(huì)導(dǎo)致構(gòu)建速度較慢,但可以確保運(yùn)行每個(gè)步驟。指定--no-cache
對(duì)于調(diào)試構(gòu)建問(wèn)題非常有幫助。你也可以使用它來(lái)強(qiáng)制升級(jí)依賴項(xiàng),例如我們?cè)谏厦娴?code>apt-get install -y curl。
在特定位置使使緩存失效
有時(shí)候你需要在Dockerfile
的特定位置使緩存失效。例如,你可能想在npm install
步驟之后使緩存失效,以便調(diào)試npm build
步驟。你可以使用ARG指令來(lái)實(shí)現(xiàn)這個(gè)技巧。我們可以在npm build
命令之前在Dockerfile中添加一個(gè)ARG STOP=1
步驟。當(dāng)我們更改它的值時(shí),這會(huì)導(dǎo)致緩存在該行失效。
... COPY . . ARG STOP=1 RUN npm build
現(xiàn)在,當(dāng)你運(yùn)行docker build
時(shí),你會(huì)發(fā)現(xiàn)在構(gòu)建步驟運(yùn)行之前,緩存會(huì)被失效。你可以通過(guò)更改值再次使其失效。你可以在Dockerfile
內(nèi)部更改它,也可以在調(diào)用docker build
時(shí)使用構(gòu)建參數(shù)來(lái)更改它。
docker build --build-arg STOP=2 .
小結(jié)
Docker構(gòu)建緩存是通過(guò)重用以前構(gòu)建的層來(lái)加速構(gòu)建的一種很好的方式。盡可能地優(yōu)化使用層緩存最終會(huì)加速Docker構(gòu)建。
但有時(shí)候,你想在沒(méi)有Docker緩存的情況下構(gòu)建鏡像。使用--no-cache選項(xiàng)將強(qiáng)制Docker守護(hù)進(jìn)程在構(gòu)建過(guò)程中運(yùn)行Dockerfile中的每個(gè)步驟。它有助于調(diào)試構(gòu)建問(wèn)題或強(qiáng)制升級(jí)操作系統(tǒng)依賴項(xiàng)。
Docker構(gòu)建緩存對(duì)于構(gòu)建Docker鏡像至關(guān)重要。還有其他基本技巧可以使你的Docker構(gòu)建速度更快。
到此這篇關(guān)于在沒(méi)有Docker緩存的情況下構(gòu)建鏡像的方法介紹的文章就介紹到這了,更多相關(guān)Docker緩存構(gòu)建鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Docker搭建Graylog分布式日志采集系統(tǒng)的詳細(xì)過(guò)程
Graylog是一個(gè)開(kāi)源的日志管理工具,支持日志收集、解析、存儲(chǔ)、搜索和可視化,它可以從各種數(shù)據(jù)源收集日志,并通過(guò)內(nèi)置的解析器將日志格式化,本文介紹基于Docker搭建Graylog分布式日志采集系統(tǒng),感興趣的朋友一起看看吧2025-02-02在Dockerfile中copy和add的區(qū)別及說(shuō)明
COPY和ADD都是Dockerfile中用于文件復(fù)制的命令,但COPY僅用于本地文件或目錄的復(fù)制,不支持自動(dòng)解壓縮;而ADD除了復(fù)制本地文件或目錄外,還支持解壓縮和從URL下載文件,在一般情況下,建議使用COPY命令2025-03-03Docker安裝Redis并使用Another?Redis?Desktop?Manager連接的方法
Redis?是一個(gè)使用C語(yǔ)言編寫的、開(kāi)源的(遵守?BSD?協(xié)議)、高性能的、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value的NoSQL數(shù)據(jù)庫(kù),這篇文章主要介紹了Docker安裝Redis并使用Another?Redis?Desktop?Manager連接,需要的朋友可以參考下2022-09-09詳解使用export/import導(dǎo)出和導(dǎo)入docker容器
本篇文章主要介紹了詳解使用export/import導(dǎo)出和導(dǎo)入docker容器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07使用Docker多階段構(gòu)建來(lái)減小鏡像大小的方法
這篇文章主要介紹了使用Docker多階段構(gòu)建來(lái)減小鏡像大小的方法,適用于需要在 Dockerfile 中構(gòu)建程式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12谷歌技術(shù)人員解決Docker鏡像體積太大問(wèn)題的方法
這篇文章主要介紹了谷歌技術(shù)人員解決Docker鏡像體積太大問(wèn)題的方法,涉及虛擬機(jī),谷歌docker鏡像構(gòu)建實(shí)踐及構(gòu)建工具bazel的介紹等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11