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

Fly.io构建Next.js+Prisma应用时如何获取DATABASE_URL秘钥

在Fly.io部署集成Prisma的Next.js应用时,构建阶段缺失DATABASE_URL的解决方案

问题场景

在Fly.io上部署集成Prisma的Next.js应用,已配置Fly Postgres,flyctl secrets list能确认DATABASE_URL存在,但构建阶段执行npx prisma generate时报错:

#21 28.33 error: Environment variable not found: DATABASE_URL.
#21 28.33   -->  schema.prisma:10

常规方案要求通过SSH获取变量并以--build-arg传入,但应用未构建完成无法SSH,且Fly自动生成的DATABASE_URL无法直接查看。


解决方案

方案1:暴露DATABASE_URL到构建阶段(推荐)

Fly.io支持将已有的secrets暴露给构建阶段,无需手动获取变量值,执行以下命令:

flyctl secrets set DATABASE_URL=$(flyctl secrets get DATABASE_URL) --stage build

这条命令会读取现有DATABASE_URL的secret值,同时将其设置为构建阶段可用的变量。

完成后直接重新部署即可:

fly deploy

你的现有Dockerfile无需修改,build阶段的RUN npx prisma generate会自动读取到构建阶段的DATABASE_URL。

方案2:本地预生成Prisma客户端

在本地生成Prisma客户端后提交到代码仓库,跳过构建阶段的生成步骤:

  1. 临时在本地创建.env文件,写入从flyctl secrets get DATABASE_URL获取到的变量值
  2. 本地执行生成命令:
npx prisma generate
  1. 修改.gitignore,添加例外规则:
!node_modules/.prisma/
!prisma/client/
  1. 将生成的文件提交到代码仓库
  2. 修改Dockerfile,删除build阶段的RUN npx prisma generate命令,确保最终镜像能复制到生成的文件(你的现有Dockerfile已经包含COPY --from=build /app/node_modules/.prisma /app/node_modules/.prisma,只要本地生成后提交,这一步会正常复制)

方案3:启动时生成Prisma客户端(临时方案)

将生成步骤放到容器启动时执行,此时容器已能访问Fly的secrets:
修改最终镜像阶段的CMD命令:

CMD ["sh", "-c", "npx prisma generate && npm run start"]

此方案会增加容器启动时间,仅作为临时应急使用。


内容的提问来源于stack exchange,提问作者Marc.ad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:35:22