无法通过Prisma连接Docker中运行的PostgreSQL容器求助
Docker PostgreSQL + Prisma 连接失败排查方案
问题描述
尝试在Docker中运行PostgreSQL并通过Prisma建立连接,遇到以下问题:
- 无法ping通PostgreSQL实例
- 无法连接到Adminer
- 已规避使用
localhost代替Docker服务名的常见问题 - 关闭firewalld后问题依旧
提供的配置文件
.env 文件
DB_NAME=spot DB_HOST=postgres DB_USERNAME=spotuser DB_PASSWORD=spotpass DB_PORT=5432 DATABASE_URL=`postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public`
docker-compose.yml 文件
version: '3.1' services: postgres: image: postgres restart: always volumes: - ./db-data:/var/lib/postgresql/data environment: - POSTGRES_USER=${DB_USERNAME} - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=${DB_NAME} ports: - 5432:5432 adminer: image: adminer restart: always ports: - 8080:8080
容器运行状态
❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e66b70a9ac69 adminer "entrypoint.sh docke…" 6 minutes ago Up 2 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp spot-spot-adminer-1 dd629496a246 postgres "docker-entrypoint.s…" 6 minutes ago Up 2 seconds 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp spot-spot-postgres-1
排查与修复步骤
等待PostgreSQL容器完成初始化
从docker ps输出看,PostgreSQL容器仅启动2秒,PostgreSQL初始化需要一定时间,通常要等日志出现database system is ready to accept connections才算就绪。可以通过日志查看进度:docker logs dd629496a246修正.env中DATABASE_URL的语法错误
.env文件里的DATABASE_URL使用了shell反引号,这会导致变量解析异常,Prisma无法正确读取连接字符串,应改为:DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public修改后重启Prisma服务或重新生成客户端:
npx prisma generate测试容器内部网络连通性
进入Adminer容器,尝试ping PostgreSQL服务名,验证Docker内部网络是否正常:docker exec -it spot-spot-adminer-1 ping postgres如果ping不通,检查docker-compose是否为服务创建了默认网络,确保两个服务在同一网络中。
宿主机本地连接测试
从宿主机直接用psql测试连接,确认端口映射是否正常:psql -h localhost -p 5432 -U spotuser -d spot如果连接失败,检查宿主机5432端口是否被其他进程占用:
lsof -i :5432Adminer连接配置修正
使用Adminer连接时,服务器地址填写postgres(而非localhost),用户名填spotuser,密码spotpass,数据库名spot,端口保持默认5432即可。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

