docker 优化
利用镜像缓存
相对于项目的源文件来讲,package.json 是相对稳定的。如果没有新的安装包需要下载,则再次构建镜像时,无需重新构建依赖。则可以在 npm install 上节省一半的时间。
对于 ADD 来讲,如果需要添加的文件内容的 checksum 没有发生变化,则可以利用缓存。把 package.json/package-lock.json 与源文件分隔开写入镜像是一个很好的选择。目前,如果没有新的安装包更新的话,可以节省一半时间
...
# 首次添加此两个文件,充分利用缓存
ADD package.json package-lock.json /code
RUN npm install --production
...减少 npm install 时间
- 选择时延低的
registry,需要企业技术基础建设支持
npm config set registry https://registry-npm.shanyue.tech/NODE_ENV=production,只安装生产环境必要的包(如果 dep 与 devDep 没有仔细分割开来,工作量很大,可以放弃)CI=true,npm 会在此环境变量下自动优化- 结合 CI 的缓存功能,充分利用
npm cache
install:
- npm ci
# keep the npm cache around to speed up installs
cache:
directories:
- "$HOME/.npm"- 使用
npm ci代替npm i,既提升速度又保障应用安全性
npm ci多阶段构建
得益于缓存,现在镜像构建时间已经快了不少。但是,此时镜像的体积依旧过于庞大,这也将会导致部署时间的加长。原因如下
考虑下每次 CI/CD 部署的流程
- 在构建服务器 (Runer) 构建镜像
- 把镜像推至镜像仓库服务器
- 在生产服务器拉取镜像,启动容器