今天部署一个新项目时碰到了一个问题,项目要求的 node 版本跟构建服务器上的 node 版本不匹配, 考虑过直接升级构建服务的 node 版本,或者说在构建服务上安装 nvm (node 版本切换工具),在构建时切换版本,都觉得不是很合适,最后想起来以前用过的 docker 多阶段构建的特性,可以解决这个问题。
Dockerfile
FROM node:18 AS base
FROM base AS deps
WORKDIR /app
COPY package.json ./
RUN npm config set strict-ssl false
RUN npm install --unsafe-perm=true --allow-root
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM nginx
WORKDIR /usr/share/nginx/html/manage
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist/ ./
EXPOSE 443
EXPOSE 80
CMD nginx -g 'daemon off;'
这个 dockerfile 进行了三个阶段的构建,最后的构建阶段的产物才是我们想要的部署的产物,可以通过 COPY --from=命令来引用前面构建阶段的产物。通过多阶段构建,就可以解决前端构建的 node 版本冲突问题了。
RUN npm config set strict-ssl false 这一行是用于解决 npm 下载时证书失效的问题。