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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:50:21