如何优化使用Docker部署的项目的部署速度
原本的dockerfile
# Workdir is unprivileged user home
WORKDIR /usr/src/app
# 安装依赖
COPY package.json /usr/src/app
COPY package-lock.json /usr/src/app
COPY .npmrc /usr/src/app
RUN npm install
# 复制代码
COPY . /usr/src/app/
RUN npm run postinstall
# build正式环境
RUN npm run build
在观察Jenkins的输出结果中可发现
Step 9/20 : COPY package.json /usr/src/app
---> Using cache
---> 1f7a1ece8500
Step 10/20 : COPY .npmrc /usr/src/app
---> Using cache
---> 01a69dbb8206
Step 11/20 : COPY ./packages /usr/src/app/
---> Using cache
---> 3809c07708fd
Step 12/20 : RUN npm install
---> Using cache
---> 6b7c4a5f8026
Step 13/20 : COPY . /usr/src/app/
---> 002ac521832a
Step 14/20 : RUN npm install
[91minfo[0m[91m [0m[91msentry-cli Downloading from https://npm.taobao.org/mirrors/sentry-cli/1.71.0/sentry-cli-Linux-x86_64
[0mfetching sentry-cli-Linux-x86_64 1%
fetching sentry-cli-Linux-x86_64 2%
fetching sentry-cli-Linux-x86_64 3%
原先的 Dockerfile 通过 COPY . /usr/src/app/ 引起了文件变动,导致缓存失效,重新下载了 sentry 的二进制文件。经过修正后的 Dockerfile 将 postinstall 提前到 COPY . /usr/src/app/ 前面,避免因文件变动而引起缓存失效。另外,将 npm install 和 npm run build 分别独立开来,不再混在一起。
以下是更改后的dockerfile
WORKDIR /usr/src/app
# 安装依赖
COPY package.json /usr/src/app
COPY package-lock.json /usr/src/app
COPY .npmrc /usr/src/app
RUN npm install
RUN npm run postinstall
COPY . /usr/src/app/
RUN npm run build
同时,在查看 Webpack 的 SMP Plugins 插件打印的 Webpack 不同步骤耗时时发现,imagemin-webpack 这个图片压缩插件需要花费2分钟20秒,增加了构建时间。优化方法是将项目中的所有图片在本地压缩完,再上传到 Git。这样修改后可以减少近1分钟的构建时间,提高构建效率。
修改前
imagemin-webpack took 2 mins, 20.46 secs
module count = 35
修改后
imagemin-webpack took 1 min, 18.77 secs
module count = 35