很多时候,构建 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 .
这样一来,我们可以避免几个问题:
- 如果基础的依赖有改变,在 venv 的基础上,pnpm 可以减少 npm 包的反复下载。
- 一段时间后,我们可以重新构建
frontend-base
,来减少在frontend
中包的下载。