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 时间

  1. 选择时延低的 registry,需要企业技术基础建设支持
npm config set registry https://registry-npm.shanyue.tech/
  1. NODE_ENV=production,只安装生产环境必要的包(如果 dep 与 devDep 没有仔细分割开来,工作量很大,可以放弃)
  2. CI=true,npm 会在此环境变量下自动优化
  3. 结合 CI 的缓存功能,充分利用 npm cache
install:
  - npm ci
# keep the npm cache around to speed up installs
cache:
  directories:
    - "$HOME/.npm"
  1. 使用 npm ci 代替 npm i,既提升速度又保障应用安全性
npm ci

多阶段构建

得益于缓存,现在镜像构建时间已经快了不少。但是,此时镜像的体积依旧过于庞大,这也将会导致部署时间的加长。原因如下

考虑下每次 CI/CD 部署的流程

  1. 在构建服务器 (Runer) 构建镜像
  2. 把镜像推至镜像仓库服务器
  3. 在生产服务器拉取镜像,启动容器