Docker構建Dockerfile時如何快取RUN npm install指令?
簡介
構建Docker映象時,最耗時和資源密集的步驟之一是執行“RUN npm install”指令。此指令會安裝package.json檔案中列出的所有依賴項。快取此指令的結果可以大大縮短映象的構建時間。在本文中,我們將探討在Dockerfile中快取“RUN npm install”指令的不同策略。
快取策略
在Dockerfile中快取“RUN npm install”指令有幾種策略,包括:
使用.dockerignore檔案 − 此策略包括將node_modules目錄排除在複製到映象之外。這是透過建立一個.dockerignore檔案並在其中列出node_modules目錄來實現的。構建映象時,不會複製node_modules目錄中的檔案,並且會再次執行“RUN npm install”指令。此策略易於實現,但有一個缺點,即它會增加映象的大小,因為它將包含所有依賴項。
多階段構建 − 此策略包括在Dockerfile中使用多個FROM語句來建立多個映象,每個映象都有特定的用途。構建的第一階段安裝依賴項並複製node_modules目錄。構建的第二階段僅複製第一階段的必要檔案,例如應用程式程式碼。此策略減小了映象的大小,但設定和維護起來可能更復雜。
使用package-lock檔案 − 此策略包括使用package-lock檔案(例如npm-shrinkwrap.json或yarn.lock)來確保一致的安裝。這些檔案鎖定依賴項的版本,以便每次構建映象時都安裝相同的版本。此策略易於實現,並有助於確保一致性,但如果依賴項更新而鎖定檔案未更新,則可能會導致問題。
使用npm快取卷 − 此策略包括為npm快取建立一個卷,並將其用於“RUN npm install”指令。由於軟體包已快取,這將使npm install更快,但需要額外配置和管理卷。
使用BuildKit − BuildKit是Docker 18.09版本中新增的一項功能,可提高構建效能。它允許跨多個階段和映象快取npm軟體包,從而減少npm install指令的時間。
使用--no-cache標誌 − 此策略包括在“RUN npm install”指令中使用--no-cache標誌,該標誌告訴Docker在執行命令時不要使用快取。如果快取存在問題或依賴項已更新,這將很有用。但是,這會增加構建時間。
在Dockerfile中實現快取
以下是如何在Dockerfile中實現上述一些策略的示例:
使用.dockerignore檔案 −
# .dockerignore file node_modules # Dockerfile COPY . . RUN npm install
多階段構建 −
# Dockerfile FROM node:12 as builder COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build FROM node:12 COPY --from=builder node_modules node_modules COPY --from=builder dist dist CMD ["npm", "start"]
使用package-lock檔案 −
# package-lock.json or yarn.lock file ... # Dockerfile COPY package.json package-lock.json ./ RUN npm ci COPY . .
使用npm快取卷 −
# Dockerfile VOLUME /root/.npm COPY package.json package-lock.json ./ RUN npm ci --cache /root/.npm COPY . .
使用BuildKit −
# Dockerfile COPY package.json package-lock.json ./ RUN --mount=type=cache,target=/root/.npm npm ci COPY . .
使用--no-cache標誌 −
# Dockerfile COPY package.json package-lock.json ./ RUN npm ci --no-cache COPY . .
在Docker中快取RUN npm install指令的最佳實踐
使用package-lock檔案(例如npm-shrinkwrap.json或yarn.lock)來確保一致的安裝並鎖定依賴項的版本。
使用多階段構建僅複製前一個構建的必要檔案(例如node_modules目錄),這有助於減小映象的大小。
使用.dockerignore檔案將node_modules目錄排除在複製到映象之外,這有助於加快構建時間,但可能會增加映象的大小。
使用npm快取捲來跨多個階段和映象快取npm軟體包,從而減少npm install指令的時間。
使用BuildKit,這是Docker 18.09版本中新增的一項功能,它可以提高構建效能並允許跨多個階段和映象快取npm軟體包。
謹慎使用--no-cache標誌,因為它會告訴Docker在執行命令時不要使用快取,並且會增加構建時間。
定期監控快取,檢查快取並在必要時清除快取,如果您發現快取無法按預期工作。
保持您的依賴項更新,如果您使用package-lock檔案,請確保相應地更新鎖定檔案。
始終在啟用和停用快取的情況下測試您的構建,以確保快取按預期工作。
考慮使用單獨的容器或服務來處理npm install步驟,這有助於加快構建過程並確保跨多個構建的一致性。
結論
在Dockerfile中快取“RUN npm install”指令可以大大縮短映象的構建時間。有幾種快取策略,包括使用.dockerignore檔案、多階段構建、package-lock檔案、npm快取卷、BuildKit和--no-cache標誌。每種策略都有其自身的優缺點,最適合您的用例的策略將取決於您的特定需求。要對快取進行故障排除和維護,您可以使用Docker快取命令並在需要時清除快取。