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

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. 修正中间件逻辑

你现有中间件存在两处明显错误:

  1. 不该判断locale === "default",你配置的defaultLocale是en,正常读取到配置的情况下请求的locale只会是你声明的en、fr,出现default本身就代表配置未加载
  2. 重定向路径拼接错误,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:01