使用依赖镜像优化docker构建流程

原流程

构建应用程序镜像时安装依赖,例如:

Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
FROM node:12.22.0-alpine

# ... something to do ...

# Copy application files, including package.json
COPY ./dist /usr/local/app/
COPY ./package.json /usr/local/app/
WORKDIR /usr/local/app/

RUN npm install --production --unsafe-perm && npm cache clean --force

CMD ["npm", "start"]

优点:

  1. 流程简单,仅需维护 package.json 文件,不需要其他人为操作

缺点:

  1. 每次构建都需要重新装包,增加构建时长。
  2. 依赖版本不确定,存在部分依赖自动升级的情况,极端情况下可能会出现 bug(除非上传 package-lock 文件)

优化流程

利用构建引用镜像前先构建依赖镜像,例如:

Dockerfile-dependencies:

1
2
3
4
5
6
7
8
9
10
11
FROM node:12.22.0-alpine

# ... something to do ...

# Copy application files
COPY ./package.json /usr/local/app/
WORKDIR /usr/local/app/

RUN npm install --production --unsafe-perm && npm cache clean --force

CMD ["node"]

先用构建一个基础依赖镜像,并提供 package.json 安装引用程序所需要的依赖。

该镜像会被上传至镜像仓库中,当我们构建应用程序镜像时,可直接作为基础镜像使用,不需要再次安装依赖。

同时在构建应用后再次检测安装的依赖和需求的依赖是否一致,保证服务能够正常运行。

Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
FROM registry.xxx.xx/web:dep-latest

# Copy application files
COPY ./package.json /usr/local/app/
COPY ./dist /usr/local/app/
WORKDIR /usr/local/app/

# RUN npm install --production --unsafe-perm && npm cache clean --force
RUN npm list --production

CMD ["npm", "start"]

优点:

  1. 只要服务端依赖没有变化,同一个镜像可以被反复使用,节约了大量的构建时间。
  2. 依赖包版本固定,不会因为装包失败或者升级导致程序异常

构建性能对比

指标 原方案 优化方案 依赖构建时间
应用程序+docker 镜像构建时间 2m40s 1m30s

目前该博客的构建方式就是采用这种方式,并且通过判断 master 分支上修改的文件类型自动识别是否需要重新构建依赖镜像。


使用依赖镜像优化docker构建流程
https://www.wobushi.top/2021/使用依赖镜像优化docker构建流程/
作者
Pride Su
发布于
2021年8月3日
许可协议