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设计的标准运行时配置方式,无需在构建阶段注入敏感变量,更安全:
- 修改
docker-compose.yml,给环境变量添加NUXT_前缀:services: portal: environment: NUXT_JWT_SECRET: ${JWT_SECRET} # ... 其他环境变量 - 简化
nuxt.config.ts的配置(Nuxt会自动完成映射):
原理:Nuxt3运行时会自动将以export default defineNuxtConfig({ runtimeConfig: { jwtSecret: '', // Nuxt运行时会自动读取NUXT_JWT_SECRET的值 }, // ... 其他配置 })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值。
验证步骤
- 清理旧构建产物与容器:
docker-compose down -v && docker-compose build --no-cache - 重新启动服务:
docker-compose up - 测试
/api/auth/login接口,确认useRuntimeConfig().jwtSecret已正确获取到值。
注意事项
- 敏感变量(如JWT密钥)属于服务端私有配置,绝对不要放在
publicRuntimeConfig中,避免暴露给客户端。 - 本地
nuxt dev模式下正常工作,是因为开发模式构建与运行在同一进程,环境变量实时共享,不存在阶段隔离问题。
内容的提问来源于stack exchange,提问作者SkyN
相关产品推荐
相关产品推荐

