Docker中运行带i18n国际化的Next.js应用报错如何解决?
问题根因
报错核心原因是Next.js中间件运行时未正常读取到next.config.js中的i18n配置,结合你提供的配置信息,同时存在中间件逻辑错误、Docker构建流程不规范两个问题。
排查思路
- 进入运行中的Docker容器,执行
cat /app/next.config.js确认i18n配置确实存在,未被覆盖或拷贝遗漏 - 对比本地开发环境、package.json声明的Next.js版本、容器内安装的版本是否完全一致,不同版本对中间件i18n的处理逻辑存在差异
- 确认本地执行
next build的架构(x86/arm)和容器运行架构是否一致,跨架构构建的产物会出现运行时配置读取异常 - 在中间件中打印
request.nextUrl完整属性,确认是否能正常读取到locales配置项
解决方法
1. 修正中间件逻辑
你现有中间件存在两处明显错误:
- 不该判断
locale === "default",你配置的defaultLocale是en,正常读取到配置的情况下请求的locale只会是你声明的en、fr,出现default本身就代表配置未加载 - 重定向路径拼接错误,
request.nextUrl.href是带域名的完整URL,直接前缀拼接会生成非法路径
修正后的中间件代码:
import { NextRequest, NextResponse } from "next/server"; const PUBLIC_FILE = /\.(.*)$/; export function middleware(request: NextRequest) { // 跳过静态资源和API请求 if ( PUBLIC_FILE.test(request.nextUrl.pathname) || request.nextUrl.pathname.includes("/api/") ) { return undefined; } // 未匹配到合法locale时跳转到默认语言路径 if (!["en", "fr"].includes(request.nextUrl.locale)) { const url = request.nextUrl.clone(); url.pathname = `/en${url.pathname}`; return NextResponse.redirect(url); } return undefined; }
2. 修正Docker构建流程
不要直接拷贝本地构建的.next文件夹,本地构建的产物和本地环境、架构强绑定,放到容器中大概率会出现配置读取异常。建议使用多阶段构建,在容器内部完成依赖安装和构建流程,参考Dockerfile如下:
FROM node:18-alpine AS base # 依赖安装阶段 FROM base AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci # 构建阶段 FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build # 运行阶段 FROM base AS runner WORKDIR /app ENV NODE_ENV production RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static USER nextjs EXPOSE 3000 ENV PORT 3000 CMD ["node", "server.js"]
同时需要在next.config.js中开启独立构建配置,你之前添加的rewrites规则完全无效可以直接删除,修改后的配置如下:
module.exports = { reactStrictMode: true, output: 'standalone', i18n: { locales: ["en", "fr"], defaultLocale: "en", } };
3. 特殊场景兼容
如果确实需要直接拷贝本地构建的.next文件夹到容器运行,必须满足以下条件:
- 本地和容器的Next.js版本完全一致
- 本地构建的CPU架构和容器运行架构完全一致
- 容器内运行Next.js的工作目录必须和构建时的工作目录一致,保证
next.config.js可以被正常读取
内容的提问来源于stack exchange,提问作者KBT
相关产品推荐
相关产品推荐

