TurboRepo+Next.js+Docker中NEXT_PUBLIC构建变量无法正确读取
Next.js + TurboRepo + Docker Compose 环境变量读取问题
通过Docker Compose传递构建变量时,Next.js客户端脚本无法正确读取process.env.NEXT_PUBLIC_API_URL。Docker环境中打印process.env显示变量配置正确,但客户端获取的值不对。生产环境不想使用.env文件(已通过.dockerignore忽略),希望直接将变量注入process.env。
客户端变量调用方式
process.env.NEXT_PUBLIC_API_URL
Docker Compose 配置
services: web: build: context: . dockerfile: ./apps/web/Dockerfile restart: always environment: - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} ...
Next.js 项目 Dockerfile
FROM node:22-alpine AS base FROM base AS builder # 安装libc6-compat以适配部分依赖 RUN apk update RUN apk add --no-cache libc6-compat WORKDIR /app RUN npm install -g turbo COPY . . RUN turbo prune web --docker FROM base AS installer RUN apk update RUN apk add --no-cache libc6-compat WORKDIR /app # 先安装依赖(依赖变更频率低) COPY --from=builder /app/out/json/ . RUN npm install # 构建项目 COPY --from=builder /app/out/full/ . RUN npx turbo run build FROM base AS runner WORKDIR /app # 非root用户运行生产环境 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs USER nextjs # 利用输出追踪减小镜像体积 COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public CMD node apps/web/server.js
根目录 turbo.json 配置
{ "$schema": "https://turbo.build/schema.json", "tasks": { "build": { "inputs": ["$TURBO_DEFAULT$", ".env*"], "outputs": ["dist/**", ".next/**", "!.next/cache/**", "public/dist/**"], "dependsOn": ["^build"] }, ... } }
已尝试的解决方案
- 在不使用TurboRepo和Docker Compose的独立环境中运行Web项目,变量能被正确读取
- 在Dockerfile中通过ARG传递
NEXT_PUBLIC_API_URL - 按照TurboRepo文档在turbo.json的
globalEnv、build env和web#build中配置NEXT_PUBLIC_API_URL - 按照Next.js文档在
next.config.ts中配置NEXT_PUBLIC_API_URL - 使用
turbo run build --env-mode=loose命令执行构建 - 在Web项目中创建新的turbo.json,继承根配置并设置环境变量
问题现状
Docker Compose中的环境变量已正确设置,但Next.js客户端仍无法获取正确值,变量呈现静态状态无法修改。
内容的提问来源于stack exchange,提问作者tuke307
相关产品推荐
相关产品推荐

