Next.js Docker构建疑问:无需安装TS开发依赖如何完成生产构建?
解决方案:Docker多阶段构建
不用把TypeScript及@types依赖移出开发依赖,用多阶段构建就能同时满足CI类型检查和生产环境轻量化的需求。
修改后的Dockerfile:
# 第一阶段:负责构建应用,安装全部依赖(包括dev) FROM node:16.16.0 AS builder WORKDIR /var/www/project-front COPY package.json yarn.lock ./ # 安装所有依赖,包括devDependencies(构建需要TypeScript做类型校验) RUN yarn install --frozen-lockfile COPY ./ /var/www/project-front # 执行构建,自动做TypeScript类型检查,失败则终止构建,符合CI要求 RUN yarn build # 第二阶段:生产运行镜像,只保留必要文件 FROM node:16.16.0 RUN npm install --location=global pm2 WORKDIR /var/www/project-front # 复制依赖配置文件,只安装生产依赖 COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile --production # 从构建阶段复制已完成的构建产物 COPY --from=builder /var/www/project-front/.next ./.next COPY --from=builder /var/www/project-front/public ./public COPY --from=builder /var/www/project-front/next.config.js ./next.config.js EXPOSE 3000 USER node CMD [ "pm2-runtime", "start", "npm", "--", "start" ]
方案优势:
- CI类型检查不丢失:构建阶段会安装所有开发依赖,
yarn build过程中Next.js会自动执行TypeScript类型校验,校验不通过直接终止构建,完全保留CI的检查能力,不用开ignoreBuildErrors。 - 生产镜像轻量化:最终的生产镜像只包含运行所需的生产依赖,构建阶段的dev依赖不会被带入,镜像体积更小,运行时也没有冗余包。
可选优化:
如果项目有单独的类型检查命令(比如yarn type-check),可以在构建阶段单独执行,提前排查类型问题:
# 在builder阶段的COPY之后、build之前添加 RUN yarn type-check
内容的提问来源于stack exchange,提问作者Jesper
相关产品推荐
相关产品推荐

