You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js独立构建在Docker容器中不生成node_modules文件夹问题

问题描述

我在Node.js 22.16环境下使用Next.js 15.3.1,将项目配置为独立构建模式。本地执行npm run build后,./.next/standalone文件夹会生成包含依赖的node_modules,启动服务正常。但构建Docker容器时,该文件夹下未生成node_modules,导致容器启动因找不到next模块崩溃。临时通过添加RUN npm install --omit=dev解决,但此方式无法缓存依赖且增大镜像体积,附上当前Dockerfile,寻求合理解决方案。

# Install build dependencies
FROM node:22.16-bookworm AS dependencies
WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci

# Build application
FROM node:22.16-bookworm AS builder
WORKDIR /app

ENV NEXT_TELEMETRY_DISABLED=1

# Copy source code and build
COPY --from=dependencies /app/node_modules ./node_modules
COPY package.json eslint.config.mjs tsconfig.json ./
COPY . ./frontend
RUN npm run build frontend

# The runtime environment
FROM node:22.16-slim AS runtime
WORKDIR /app

ENV NEXT_TELEMETRY_DISABLED=1

# Copy build results, leveraging output traces to reduce image size
COPY --from=builder /app/frontend/.next/standalone /app
COPY --from=builder /app/frontend/public ./public
COPY --from=builder /app/frontend/.next/static ./.next/static

EXPOSE 3000
ENV HOSTNAME="0.0.0.0"
ENV PORT=3000

# Start application
CMD ["node", "server.js"]
解决方案

问题核心是Docker构建阶段的工作目录与项目结构不匹配,导致Next.js独立构建逻辑无法正确识别项目根目录,进而未能将依赖打包进standalone文件夹。以下是针对性的修正方案:

1. 修正Dockerfile结构

调整构建阶段的文件复制路径,让Next.js在正确的项目根目录下执行构建,确保standalone目录生成完整的依赖文件:

# Install build dependencies
FROM node:22.16-bookworm AS dependencies
WORKDIR /app

# 直接复制frontend目录下的依赖配置文件
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci

# Build application
FROM node:22.16-bookworm AS builder
WORKDIR /app

ENV NEXT_TELEMETRY_DISABLED=1

COPY --from=dependencies /app/node_modules ./node_modules
# 复制frontend下的配置文件到工作目录根
COPY frontend/package.json frontend/eslint.config.mjs frontend/tsconfig.json ./
# 复制整个frontend项目内容到工作目录
COPY frontend/ ./

# 直接执行npm run build,无需指定frontend参数
RUN npm run build

# The runtime environment
FROM node:22.16-slim AS runtime
WORKDIR /app

ENV NEXT_TELEMETRY_DISABLED=1

# 复制构建好的standalone目录(已包含完整node_modules)
COPY --from=builder /app/.next/standalone /app
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/static ./.next/static

EXPOSE 3000
ENV HOSTNAME="0.0.0.0"
ENV PORT=3000

CMD ["node", "server.js"]

2. 关键调整说明

  • 依赖安装阶段:直接读取frontend目录下的依赖配置,确保安装的是项目实际需要的依赖包。
  • 构建阶段:将项目源码复制到构建容器的工作目录根,让Next.js的构建逻辑能正确识别项目结构,自动将生产依赖打包进standalone/node_modules。
  • 运行阶段:无需额外安装依赖,直接复用构建阶段生成的standalone目录,既保证了依赖缓存有效,又最小化镜像体积。

3. 验证效果

重新构建Docker镜像后,启动容器时不会再出现模块缺失错误,同时dependencies阶段会缓存依赖安装结果,只有当package.json或package-lock.json变更时才会重新执行npm ci,大幅提升构建效率。

内容的提问来源于stack exchange,提问作者Sam Hill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:05:01