使用一个基础镜像来避免反复安装依赖项

很多时候,构建 docker 镜像的速度很慢,尤其是当我们的基础依赖发生改变之后。为了解决这个问题,我们应该在实际运行的镜像之前,增加一个 venv 的基础镜像。

如果我们想要构建一个前端的镜像,那么不可避免的要下载和安装使用 npm 包。我们可以构建一个基础镜像,名称为 frontend-base。 镜像的内容dockerfile.base如下:

  FROM node:20 as build-stage

  WORKDIR /app

  ENV ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"

  COPY pnpm-lock.yaml package.json /app/
  RUN npm install -g pnpm && pnpm install

  COPY . .
  RUN pnpm run build:vite

运行命令构建镜像:docker build -f Dockerfile.base -t svtter/frontend-base:latest . 如此一来,我们可以构建好一个frontend-base:latest镜像。 然后,我们再构建frontend:latest镜像,作为我们实际部署应用的镜像。 dockerfile是这样的。

# FROM node:20 as build-stage
FROM svtter/cathodic-frontend-base:latest as build-stage

WORKDIR /app

ENV ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"

COPY pnpm-lock.yaml package.json /app/
RUN pnpm install

COPY . .
RUN pnpm run build:vite


FROM nginx:1.25.1 as prod

COPY --from=build-stage /app/src/out /usr/share/nginx/html

注意:因为我的代码里使用了 electron,所以为了速度更快,我使用了ELECTRON_MIRROR

这里的构建命令是:docker build -t svtter/frontend:latest . 这样一来,我们可以避免几个问题:

  1. 如果基础的依赖有改变,在 venv 的基础上,pnpm 可以减少 npm 包的反复下载。
  2. 一段时间后,我们可以重新构建 frontend-base,来减少在 frontend 中包的下载。

也可以看看