對應用程序進行Docker化很是簡單,有效,可是優化Docker Image的大小是棘手的部分。 Docker易於使用,可是一旦應用程序開始擴展,鏡像大小就會呈指數增加。一般,大多數狀況下,應用程序的Node.js docker鏡像大小超過1 GB。node
這是使用VueJS應用程序構建的演示應用程序。git
這是初始的Dockerfile。github
FROM node:10 WORKDIR /app COPY . /app EXPOSE 8080 RUN npm install http-server -g RUN npm install && npm run build CMD http-server ./dist
該鏡像的大小爲1.34GB:docker
讓咱們開始逐步優化。npm
1:使用多階段Docker構建安全
多階段構建可經過在單個Dockerfile中使用多箇中間鏡像來輕鬆優化Docker鏡像。在此處瞭解更多信息。經過使用多階段構建,咱們能夠在構建鏡像中安裝全部依賴項,並將它們複製到精簡運行時鏡像中。bash
FROM node:10 AS BUILD_IMAGE WORKDIR /app COPY . /app EXPOSE 8080 RUN npm install && npm run build FROM node:10 WORKDIR /app # copy from build image COPY --from=BUILD_IMAGE /app/dist ./dist COPY --from=BUILD_IMAGE /app/node_modules ./node_modules RUN npm i -g http-server CMD http-server ./dist
如今,此鏡像的大小爲1.24GB:markdown
2:刪除開發依賴項並使用 Node Prune 工具網絡
node-prune
是一個開源工具,用於從node_modules
文件夾中刪除不須要的文件。一般在生產環境中根本不須要Npm包中的測試文件,markdown文件,類型文件和* .map文件,大多數開發人員都不會從生產包中刪除它們。經過使用node-prune
,能夠安全地將其刪除。app
咱們可使用它來刪除開發依賴項:
npm prune --production
進行這些更改後,Dockerfile
將以下所示:
FROM node:10 AS BUILD_IMAGE RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin WORKDIR /app COPY . /app EXPOSE 8080 RUN npm install && npm run build # remove development dependencies RUN npm prune --production # run node prune RUN /usr/local/bin/node-prune FROM node:10 WORKDIR /app # copy from build image COPY --from=BUILD_IMAGE /app/dist ./dist COPY --from=BUILD_IMAGE /app/node_modules ./node_modules RUN npm i -g http-server CMD http-server ./dist
經過使用此選項,咱們將總體大小減少到1.09GB。
3:選擇較小的最終基礎鏡像
在對Node.js應用程序進行docker化時,有不少基本鏡像可供選擇。
這裏咱們將使用 alpine 鏡像; alpine是一個精簡的docker鏡像,具備最少的軟件包,但足以運行節點應用程序。
FROM node:10 AS BUILD_IMAGE RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin WORKDIR /app COPY . /app EXPOSE 8080 RUN npm install && npm run build # remove development dependencies RUN npm prune --production # run node prune RUN /usr/local/bin/node-prune FROM node:10-alpine WORKDIR /app # copy from build image COPY --from=BUILD_IMAGE /app/dist ./dist COPY --from=BUILD_IMAGE /app/node_modules ./node_modules RUN npm i -g http-server CMD http-server ./dist
經過使用此Dockerfile,鏡像大小降至157MB 。
經過應用這3個簡單步驟,咱們將docker鏡像大小減少了10倍。
PS: 本文屬於翻譯,原文