Next.js 12.2中间件在Docker环境中失效问题求助
解决Next.js 12.2稳定版中间件在Docker中不执行的问题
核心排查点与解决方案
1. 修正middleware.ts的存放位置
Next.js 12.2将稳定版中间件的存放位置从pages目录调整到了项目根目录(和package.json、next.config.js同级),而非你当前放置的pages目录下。之前beta版的_middleware.ts放在pages是正确的,但稳定版变更了规则,这是最可能的原因。
操作:把middleware.ts从pages/目录移动到项目根目录。
2. 确保Docker镜像中依赖完全更新
Docker构建时可能缓存了旧版本的node_modules,导致实际运行的Next.js版本还是12.0.7而非12.2。
操作:
- 在Dockerfile中添加清理缓存的步骤:
RUN yarn cache clean RUN yarn install --frozen-lockfile - 构建镜像时加上
--no-cache参数,强制重新安装依赖:docker build --no-cache -t your-image-name .
3. 验证Docker构建流程是否正确执行next build
确保Dockerfile中包含生产构建步骤,且产物被正确复制:
# 构建应用 RUN yarn build # 复制构建产物到运行目录 COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./package.json
4. 排查PM2启动配置问题
如果使用PM2启动,先尝试直接用next start启动应用,排除PM2配置的干扰:
- 在Docker容器中执行
yarn next start,观察是否能触发中间件的console.log输出。 - 如果直接启动正常,检查PM2配置文件(如
ecosystem.config.js),确保启动命令指向next start,且没有限制进程的日志输出。
5. 确认日志输出配置
Docker容器中可能没有正确捕获Next.js的日志,导致看不到console.log的输出:
- 调整PM2配置,开启日志输出:
module.exports = { apps: [{ name: 'next-app', script: 'yarn', args: 'next start', out_file: '/dev/stdout', error_file: '/dev/stderr', merge_logs: true }] }; - 使用
docker logs <container-id>查看容器的所有输出日志。
内容的提问来源于stack exchange,提问作者Martín Cabo
相关产品推荐
相关产品推荐

