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

NextJS部署Synology Docker环境变量重置问题求助

解决Next.js Docker部署后环境变量重置为默认值的问题

核心问题分析

  1. 镜像构建阶段固化默认值:你的Dockerfile在构建镜像时执行了npm run build,此时docker-compose中配置的环境变量还未注入容器,Next.js会使用next.config.ts里的默认值完成构建,这些值会被永久固化到静态产物中,后续容器启动时传入的环境变量无法覆盖。
  2. next.config.ts配置错误:Next.js的next.config.ts中env字段的取值是在构建阶段解析的,而非运行时。这意味着即使容器启动时传入了正确的变量,已经构建好的代码仍会使用构建时的默认值。

分步修复方案

1. 修正next.config.ts,移除静态环境变量配置

删除next.config.ts中手动定义的env对象,让Next.js直接从运行时环境读取变量:

import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  typescript: { ignoreBuildErrors: true },
  eslint: { ignoreDuringBuilds: true },
};

export default nextConfig;
  • 服务端代码(API路由、getServerSideProps、后端逻辑):直接用process.env.VAR_NAME读取,容器启动时的环境变量会被自动加载。
  • 客户端代码(页面组件、前端逻辑):确保变量以NEXT_PUBLIC_为前缀,Next.js会自动将这些变量注入客户端环境,无需额外配置。

2. 调整Dockerfile,避免构建时固化变量

如果希望保留镜像构建时的预编译(保证生产环境启动速度),需确保构建过程不依赖可变环境变量。如果你的构建流程不需要使用这些变量(比如不需要生成环境相关的静态内容),可以保留RUN npm run build,但要确保代码中所有环境变量的读取都在运行时进行。

如果构建过程必须用到某些变量(如NEXT_PUBLIC_开头的客户端变量),不推荐通过构建参数传递(会导致镜像与环境绑定),建议改为容器启动时执行构建(代价是启动时间增加):

# 移除镜像构建阶段的build命令
# RUN npm run build 

# 修改启动命令,先构建再启动服务
CMD ["sh", "-c", "npm run build && pm2-runtime start ecosystem.config.js"]

3. 确保Synology容器配置正确传递变量

在Synology Container Manager中部署时:

  • 若使用docker-compose.yml,确认environment字段的配置正确,且未被UI配置覆盖。
  • 若手动通过UI配置,在「环境」选项卡中添加所有需要的变量,确保未勾选自动填充或使用默认值。

4. 验证PM2继承环境变量

检查ecosystem.config.js,确保没有硬编码环境变量,PM2默认会继承容器的环境变量。如果配置中有env字段,需移除或改为引用process.env:

module.exports = {
  apps: [{
    name: "mychores-app",
    script: "npm start",
    // 不要硬编码环境变量,让PM2自动继承容器环境
    // env: { ... }
  }]
};

验证修复效果

  1. 重新构建或拉取最新镜像。
  2. 启动容器后,通过API路由打印process.env的值,验证服务端是否正确读取变量。
  3. 在浏览器控制台执行console.log(process.env.NEXT_PUBLIC_CRYPTO_KEY),验证客户端变量是否生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:14:49