GitHub Actions构建Docker镜像时遇Firebase auth/invalid-api-key错误求助
解决GitHub Actions构建Docker时Firebase API Key无效的问题
核心原因
错误auth/invalid-api-key发生在Next.js构建阶段的页面数据收集环节,说明构建时未正确注入NEXT_PUBLIC_*开头的Firebase环境变量。Next.js的NEXT_PUBLIC_前缀变量是在构建时嵌入到客户端代码中的,仅在Cloud Run设置运行时环境变量无法解决构建阶段的缺失。
修复步骤
1. 修正Docker构建步骤的变量传递格式
你的build-and-push步骤中,secrets字段的转义引号是多余的,且对于NEXT_PUBLIC_这类需要暴露给客户端的变量,直接用build-args传递更直观。修改为:
- name: Build and push Docker image id: build-and-push uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a if: ${{ github.event_name != 'pull_request' }} with: context: . file: ./Dockerfile.prod build-args: | NEXT_PUBLIC_FIREBASE_API_KEY=${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }} NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }} NEXT_PUBLIC_FIREBASE_PROJECT_ID=${{ secrets.NEXT_PUBLIC_FIREBASE_PROJECT_ID }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max
2. 在Dockerfile.prod中配置构建时变量
需要在Dockerfile的构建阶段(安装依赖、编译Next.js的环节)引入这些参数并设置为环境变量,供Next.js编译使用。示例Dockerfile.prod:
# 构建阶段 FROM node:16-alpine AS builder WORKDIR /app # 声明构建参数 ARG NEXT_PUBLIC_FIREBASE_API_KEY ARG NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN ARG NEXT_PUBLIC_FIREBASE_PROJECT_ID # 设置为环境变量,让Next.js构建时能读取到 ENV NEXT_PUBLIC_FIREBASE_API_KEY=$NEXT_PUBLIC_FIREBASE_API_KEY ENV NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=$NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN ENV NEXT_PUBLIC_FIREBASE_PROJECT_ID=$NEXT_PUBLIC_FIREBASE_PROJECT_ID COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 运行阶段 FROM node:16-alpine AS runner WORKDIR /app ENV NODE_ENV production COPY --from=builder /app/public ./public COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static EXPOSE 3000 CMD ["node", "server.js"]
3. (可选)为测试阶段添加环境变量
如果你的测试用例依赖Firebase变量,需要在test-code job中注入环境变量:
jobs: test-code: runs-on: ubuntu-20.04 env: NEXT_PUBLIC_FIREBASE_API_KEY: ${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }} NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN: ${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }} NEXT_PUBLIC_FIREBASE_PROJECT_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_PROJECT_ID }} steps: - uses: actions/checkout@v3 - name: Use Node.js 16.x uses: actions/setup-node@v3 with: node-version: 16.x - run: npm ci - run: npm run test
4. 确认Next.js配置一致性
你的next.config.js配置是正确的,但要确保变量名和GitHub Secrets、Dockerfile中的完全一致,避免拼写错误。
关键说明
- Next.js的
NEXT_PUBLIC_*变量是构建时注入的,必须在Docker构建阶段就存在,运行时再设置无法生效。 - Cloud Run的环境变量仅作用于容器运行阶段,适合存储非客户端的敏感变量,不适合
NEXT_PUBLIC_开头的变量。
内容的提问来源于stack exchange,提问作者Aliton Oliveira
相关产品推荐
相关产品推荐

