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

优化Docker构建后运行报错:sh: next:not found 求助

解决Docker运行时sh: next:not found错误

问题原因

你当前的runner阶段没有安装任何依赖包,也没利用Next.js standalone构建的特性:

  • 只复制了package.json但没执行npm install/npm ci,本地没有next命令,npx next start会因为找不到next包报错
  • 你已经构建了standalone产物,这种模式下Next.js会把所有运行依赖打包到.next/standalone目录,不需要额外安装依赖或调用next start

修复方案

修改你的Dockerfile,利用standalone的独立启动能力,不需要在runner阶段装依赖:

FROM node:20-alpine AS builder
WORKDIR /src

## Set local timezone in alpine linux
ARG TZ="Europe/Bratislava"
ENV TZ=${TZ}
RUN apk upgrade -qU \
&& apk add -qu tzdata \
&& ln -s /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& rm -rf /var/cache/apk/*

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

# 确保next.config.js中启用了standalone模式(如果还没加的话)
# next.config.js里添加:
# module.exports = { output: 'standalone' }
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /src

# 复制standalone目录的所有内容(包含运行所需的node_modules和server文件)
COPY --from=builder /src/.next/standalone ./
# 复制静态资源和public目录
COPY --from=builder /src/.next/static ./.next/static
COPY --from=builder /src/public ./public

EXPOSE 3000

# 直接用node启动standalone生成的server.js
CMD ["node", "server.js"]

关键修改说明

  • 移除了runner阶段复制package.json/package-lock.json的步骤,因为standalone已经包含了所有必要依赖
  • 调整复制命令,把整个standalone目录内容复制到runner的工作目录
  • 把CMD npx next start改成CMD ["node", "server.js"],直接启动Next.js生成的独立服务文件

这样既保留了镜像小的优势(不需要额外装依赖),又能正常启动服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:53:28