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客户端后提交到代码仓库,跳过构建阶段的生成步骤:
- 临时在本地创建
.env文件,写入从flyctl secrets get DATABASE_URL获取到的变量值 - 本地执行生成命令:
npx prisma generate
- 修改
.gitignore,添加例外规则:
!node_modules/.prisma/ !prisma/client/
- 将生成的文件提交到代码仓库
- 修改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
相关产品推荐
相关产品推荐

