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

Nuxt3生产Docker构建中runtimeConfig无法从process.env取值

问题根源

你的问题核心在于Nuxt3构建阶段与运行阶段的环境变量隔离:

  • 在Docker多阶段构建的npm run build步骤中,容器并未注入JWT_SECRET环境变量,因此nuxt.config.ts里的process.env.JWT_SECRET在构建时是空值,这个空值被硬编码到了最终的构建产物(.output/server/index.mjs)中。
  • 运行阶段虽然通过Docker Compose注入了JWT_SECRET,但此时runtimeConfig.jwtSecret已经是构建时固化的空字符串,不会再从环境变量重新读取。而服务端中间件直接访问process.env.JWT_SECRET能拿到值,是因为process.env是运行时的环境变量,不受构建阶段影响。
解决方案

提供两种可靠的解决方式,按需选择:

方案1:使用Nuxt官方推荐的NUXT_前缀环境变量(推荐)

这是Nuxt3设计的标准运行时配置方式,无需在构建阶段注入敏感变量,更安全:

  1. 修改docker-compose.yml,给环境变量添加NUXT_前缀:
    services:
      portal:
        environment:
          NUXT_JWT_SECRET: ${JWT_SECRET}
          # ... 其他环境变量
    
  2. 简化nuxt.config.ts的配置(Nuxt会自动完成映射):
    export default defineNuxtConfig({
      runtimeConfig: {
        jwtSecret: '', // Nuxt运行时会自动读取NUXT_JWT_SECRET的值
      },
      // ... 其他配置
    })
    
    原理:Nuxt3运行时会自动将以NUXT_开头的环境变量,去掉前缀后映射到runtimeConfig对应的字段中,这个过程完全在运行时完成,不受构建阶段影响。

方案2:动态读取运行时环境变量(保留原变量名)

如果不想修改环境变量名,可以通过动态取值的方式让runtimeConfig在运行时读取环境变量:
修改nuxt.config.ts,将jwtSecret改为动态获取的getter:

export default defineNuxtConfig({
  runtimeConfig: {
    get jwtSecret() {
      return process.env.JWT_SECRET || '';
    },
  },
  // ... 其他配置
})

这样每次访问useRuntimeConfig().jwtSecret时,都会实时读取运行时的process.env.JWT_SECRET值。

验证步骤
  1. 清理旧构建产物与容器:
    docker-compose down -v && docker-compose build --no-cache
    
  2. 重新启动服务:
    docker-compose up
    
  3. 测试/api/auth/login接口,确认useRuntimeConfig().jwtSecret已正确获取到值。
注意事项
  • 敏感变量(如JWT密钥)属于服务端私有配置,绝对不要放在publicRuntimeConfig中,避免暴露给客户端。
  • 本地nuxt dev模式下正常工作,是因为开发模式构建与运行在同一进程,环境变量实时共享,不存在阶段隔离问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:25:03