Docker部署Node+Prisma提示找不到DATABASE_URL环境变量
问题原因
报错由两个配置错误直接导致:
- 运行Node服务的
api容器未加载.env配置文件:你仅为db服务配置了env_file规则,api容器内部完全读不到DATABASE_URL变量,Prisma初始化时自然抛出环境变量缺失错误。 DATABASE_URL的连接地址配置错误:当前配置使用localhost作为数据库主机,而Node服务运行在独立的api容器中,localhost指向容器自身,根本无法访问同网络下的PostgreSQL服务,就算环境变量加载成功也会出现连接失败问题。
修复方案
1. 为api服务补充环境变量加载配置
修改docker-compose.yml中的api服务段,添加env_file配置,让容器可以读取本地.env文件中的变量:
api: build: . container_name: server_container ports: - "4000:4000" volumes: - ./:/app networks: - api-pokemon-network depends_on: - db # 新增以下配置 env_file: - .env
2. 修正DATABASE_URL连接串
Docker自定义网络内的服务互访需要使用服务名作为主机名,不需要走宿主机端口映射。修改.env文件中的DATABASE_URL配置:
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public
改动说明:
- 主机名从
localhost改为db,和docker-compose中PostgreSQL服务的服务名一致 - 端口从宿主机映射端口
54320改为PostgreSQL容器内部默认监听端口5432,内部网络通信直接走容器端口即可
3. 重启服务加载配置
在项目根目录执行以下命令重建容器,让配置生效:
docker compose down docker compose up --build -d
排错补充
如果重启后仍然提示找不到DATABASE_URL,检查根目录下的.dockerignore文件,确认没有将.env文件排除在构建上下文外。使用Prisma 4.0及以上版本时,不需要额外在构建阶段执行prisma generate,容器内可正常读取环境变量即可完成PrismaClient初始化。
内容的提问来源于stack exchange,提问作者samuel potter
相关产品推荐
相关产品推荐

