Mac端Docker Compose映射5432端口无法访问Postgres,换端口正常求解
问题原因分析:Mac下Docker映射5432端口后Prisma连接报错,换端口正常
问题场景
配置的Docker Compose文件如下:
version: "3.7" services: postgres: container_name: mydevdb image: postgres:13 restart: always environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - postgres:/var/lib/postgresql/data ports: - "5432:5432" volumes: postgres:
环境变量文件内容:
POSTGRES_USER=username POSTGRES_PASSWORD=password POSTGRES_DB=dev DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public
执行prisma migrate dev时出现报错:
Error: P1010 User `username` was denied access on the database `dev.public`
将Docker Compose端口改为"5001:5432",并更新DATABASE_URL端口为5001后,连接恢复正常。但Ubuntu机器使用5432:5432映射时无此问题。
原因解释
核心问题是Mac主机的5432端口已被本地进程占用,导致Docker的端口映射未实际生效:
- Mac系统中,很多用户会通过Homebrew、Postgres.app等方式安装本地PostgreSQL服务,这些服务默认占用5432端口;部分其他工具也可能占用该端口。
- 当你配置Docker映射
5432:5432时,由于主机端口已被占用,Docker无法完成端口绑定(可能你没注意到启动日志里的警告)。此时Prisma连接localhost:5432时,实际访问的是本地的PostgreSQL服务,而非Docker容器内的实例。 - 本地PostgreSQL中不存在你在Docker里配置的
username用户,或者该用户没有访问dev数据库的权限,因此触发P1010权限错误。 - 而Ubuntu机器上5432端口未被占用,Docker成功完成端口映射,Prisma直接连接到容器内的PostgreSQL,所以正常工作。
验证方法
在Mac终端执行以下命令,查看5432端口的占用进程:
lsof -i :5432
如果输出中有postgres进程或其他占用端口的程序,即可确认端口被本地进程占用。
内容的提问来源于stack exchange,提问作者Khaled Developer
相关产品推荐
相关产品推荐

