如何將Node.js Docker鏡像大小減少10倍

對應用程序進行Docker化很是簡單,有效,可是優化Docker Image的大小是棘手的部分。 Docker易於使用,可是一旦應用程序開始擴展,鏡像大小就會呈指數增加。一般,大多數狀況下,應用程序的Node.js docker鏡像大小超過1 GB。node

爲何鏡像大小很重要

  • 較大的docker鏡像須要更多空間,這意味着增長費用。
  • 較長的構建時間-將鏡像經過網絡推送會花費更長的時間,並致使CI管道延遲。

讓咱們開始優化

這是使用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: 本文屬於翻譯,原文

相關文章
相關標籤/搜索