Docker部署Nuxt(Vuefire)应用时遇Firebase auth/invalid-api-key错误
检查Nuxt环境变量的加载时机与构建方式
Nuxt的NUXT_PUBLIC_前缀变量默认会在构建时注入代码中,如果你的Dockerfile是在无环境变量的情况下完成构建,运行时传入的变量不会生效——因为构建阶段已经把变量值固化到产物里了。
解决思路:要么在Docker构建阶段就传入环境变量(比如在npx nuxi build前用ARG和ENV设置变量),要么将变量改为运行时读取(通过useRuntimeConfig()而非直接引用process.env)。确认Vuefire初始化时的变量获取方式
不要在Vuefire的初始化代码中直接使用process.env.NUXT_PUBLIC_FIREBASE_API_KEY,改用Nuxt提供的useRuntimeConfig()来获取:// 在plugins/vuefire.ts或相关配置文件中 const config = useRuntimeConfig() const firebaseConfig = { apiKey: config.public.firebaseApiKey, // 其他Firebase配置项 }直接用
process.env可能在SSR的服务器端上下文里无法正确读取到运行时的环境变量,尤其是当构建阶段没有注入变量时。验证Dockerfile的多阶段构建逻辑
如果你的Dockerfile用了多阶段构建(先构建产物再复制到运行镜像),要确保构建阶段能访问到环境变量。示例:# 构建阶段 FROM node:18-alpine as builder ARG NUXT_PUBLIC_FIREBASE_API_KEY ENV NUXT_PUBLIC_FIREBASE_API_KEY=$NUXT_PUBLIC_FIREBASE_API_KEY WORKDIR /app COPY . . RUN npm install && npx nuxi build # 运行阶段 FROM node:18-alpine WORKDIR /app COPY --from=builder /app/.output ./.output ENV NUXT_PUBLIC_FIREBASE_API_KEY=$NUXT_PUBLIC_FIREBASE_API_KEY CMD ["node", ".output/server/index.mjs"]如果构建阶段没有传入变量,产物里的变量会是默认的
mock_key,运行时即使传了变量也无法覆盖。检查Cloud Run的变量传递细节
虽然本地运行容器时变量正常,但Cloud Run部署时可能存在隐藏问题:- 确认变量名完全匹配(Cloud Run环境变量名区分大小写)
- 如果用Secret Manager挂载变量,检查Secret内容是否正确(有没有多余的换行、空格)
- 临时修改Cloud Run启动命令为
printenv && node .output/server/index.mjs,查看日志确认运行时变量是否真的被容器接收
排查变量值的格式问题
检查Firebase API密钥是否包含特殊字符(比如+、/、=),这些字符在环境变量传递时可能被意外转义。可以在代码中添加调试日志:// 在vuefire初始化前添加(仅调试用,上线前删除) const config = useRuntimeConfig() console.log('Loaded API Key:', config.public.firebaseApiKey)查看Cloud Run日志,确认读取到的密钥和实际值完全一致,没有被截断或转义。
验证Nuxt配置的优先级
检查是否存在环境特定配置文件(比如nuxt.config.prod.ts),这类文件会覆盖nuxt.config.ts的配置。如果生产环境配置里硬编码了错误密钥,或者没有正确引用环境变量,就会导致问题。
内容的提问来源于stack exchange,提问作者Stf_F

