考慮下每次 CI 部署的流程
顯而易見,鏡像體積過大造成傳輸效率低下,增加每次部署的延時。
即使,構建服務器與生產服務器在同一節(jié)點下,沒有延時的問題。減少鏡像體積也能夠節(jié)省磁盤空間
關于鏡像體積的過大,很大一部分是因為node_modules 臭名昭著的體積
但最后我們只需要 public 文件夾下的內容,對于源文件以及node_modules下文件,占用體積過大且不必要,造成浪費。
此時可以利用 Docker 的多階段構建,僅來提取編譯后文件
參考官方文檔 https://docs.docker.com/develop/develop-images/multistage-build/
FROM node:alpine as builder ENV PROJECT_ENV production # http-server 不變動也可以利用緩存 WORKDIR /code ADD package.json /code RUN npm install --production ADD . /code RUN npm run build # 選擇更小體積的基礎鏡像 FROM nginx:alpine COPY --from=builder /code/public /usr/share/nginx/html
此時,鏡像體積從 1G+ 變成了 50M+
使用 CDN
分析一下 50M+ 的鏡像體積,nginx:alpine 的鏡像是16M,剩下的40M是靜態(tài)資源。
如果把靜態(tài)資源給上傳到 CDN,則沒有必要打入鏡像了,此時鏡像大小會控制在 20M 以下
關于靜態(tài)資源,可以分類成兩部分
FROM node:alpine as builder ENV PROJECT_ENV production # http-server 不變動也可以利用緩存 WORKDIR /code ADD package.json /code RUN npm install --production ADD . /code # npm run uploadCdn 是把靜態(tài)資源上傳至 cdn 上的腳本文件 RUN npm run build && npm run uploadCdn # 選擇更小體積的基礎鏡像 FROM nginx:alpine COPY --from=builder code/public/index.html code/public/favicon.ico /usr/share/nginx/html/ COPY --from=builder code/public/static /usr/share/nginx/html/static