启用SSR的Nuxt3容器无法读取docker-compose环境变量
以下是你可能遗漏的关键配置点:
确保runtimeConfig动态读取环境变量
不要在nuxt.config.ts中硬编码public字段的默认值,要优先读取环境变量,再fallback到默认值:export default defineNuxtConfig({ runtimeConfig: { public: { apiBase: process.env.NUXT_PUBLIC_API_BASE || 'http://localhost:1337' } } })注意:SSR模式下,nuxt.config中必须用
process.env,不能用客户端专用的import.meta.env。避免构建镜像时注入环境变量
如果Dockerfile里设置了ENV NUXT_PUBLIC_*指令,Nuxt会在构建时把这些值固化到客户端bundle中,导致运行时的环境变量无法覆盖。删除构建阶段的环境变量设置,保持镜像纯净,只在docker-compose运行时注入变量。组件中正确读取runtimeConfig
在组件或页面中,必须通过useRuntimeConfig()来访问public变量,不能直接读取process.env:<script setup> const config = useRuntimeConfig() // 使用配置项 const apiUrl = config.public.apiBase </script>直接访问
process.env在客户端环境中不会读取运行时变量,因为客户端bundle在构建后已固化。确认容器启动命令为生产模式
Dockerfile的启动命令必须是nuxt start或直接启动编译后的服务文件,不能用nuxt dev或nuxt build:# 正确的启动命令二选一 CMD ["npx", "nuxt", "start"] # 或者直接启动编译后的服务(推荐,更高效) CMD ["node", ".output/server/index.mjs"]nuxt start会启动生产SSR服务,并且会加载运行时环境变量;而构建命令会固化变量。检查nitro环境变量前缀配置
确认nuxt.config.ts中的nitro配置没有修改默认的环境变量前缀:export default defineNuxtConfig({ nitro: { envPrefix: 'NUXT_' // 保持默认值,不要修改 } })这个配置控制nitro引擎读取哪些前缀的环境变量,默认的
NUXT_会包含NUXT_PUBLIC_前缀的变量。验证docker-compose变量传递正确性
确保docker-compose.yml中的环境变量拼写正确,前缀为NUXT_PUBLIC_,比如:services: nuxt-app: image: your-nuxt-image environment: - NUXT_PUBLIC_API_BASE=http://your-production-api:1337 # 或者使用env_file批量加载 # env_file: # - ./env/production.env
内容的提问来源于stack exchange,提问作者johnbraum

