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快取命令並在需要時清除快取。

更新於:2023年2月17日

8K+ 瀏覽量

開啟您的職業生涯

透過完成課程獲得認證

開始
廣告