Docker中pgAdmin与PostgreSQL连接问题:容器数据库为空
你的核心问题是Docker容器挂载的数据目录和你之前Homebrew安装PostgreSQL的数据目录不一致:
- 你之前通过Homebrew安装的PostgreSQL,数据默认存储在Homebrew指定的系统目录(比如
/usr/local/var/postgresql@13),而非你当前命令中挂载的$(pwd)/ny_taxi_postgres_data。 - 当你用
-v $(pwd)/ny_taxi_postgres_data:/var/lib/postgresql/data启动Docker容器时,这个本地目录是空的,PostgreSQL会自动初始化一个全新的空数据库环境,自然看不到之前的yellow_taxi_data表。
有两种可行方案,根据你的需求选择:
方案一:直接挂载Homebrew PostgreSQL的数据目录到Docker容器
找到Homebrew PostgreSQL的数据目录
打开终端运行:brew info postgresql@13在输出中找到
Data directory字段,比如类似:/usr/local/var/postgresql@13。清理现有Docker容器
先停止并删除当前的pg-database容器:docker stop pg-database docker rm pg-database重新启动Docker容器,挂载正确的数据目录
将命令中的-v参数替换为你找到的Homebrew数据目录,注意保持PostgreSQL版本和Docker镜像一致(你用的是postgres:13,确保Homebrew安装的也是13版本):-e POSTGRES_USER="root" \ -e POSTGRES_PASSWORD="root" \ -v /usr/local/var/postgresql@13:/var/lib/postgresql/data \ -p 5431:5432 \ --network=pg-network \ --name pg-database \ postgres:13注意:不需要指定
POSTGRES_DB="ny_taxi",因为原有数据目录里已经包含这个数据库。修复目录权限(若出现启动错误)
如果容器启动失败,大概率是权限问题,Docker容器内的PostgreSQL进程用postgres用户(UID=999)运行,需要给本地数据目录设置对应权限:sudo chown -R 999:999 /usr/local/var/postgresql@13
方案二:将Homebrew中的数据迁移到Docker容器的挂载目录
如果你不想直接修改系统目录权限,可以通过数据导出/导入迁移:
启动Homebrew的PostgreSQL服务
brew services start postgresql@13导出ny_taxi数据库的数据
替换your_homebrew_user为你Homebrew PostgreSQL的默认用户(通常是你的Mac用户名):pg_dump -U your_homebrew_user ny_taxi > ny_taxi_dump.sql停止Homebrew的PostgreSQL服务
brew services stop postgresql@13启动Docker容器(挂载空目录)
用你原来的命令启动容器,此时容器会创建空的ny_taxi数据库。将数据导入到Docker容器的数据库
docker exec -i pg-database psql -U root ny_taxi < ny_taxi_dump.sql
- 确保Docker PostgreSQL镜像版本和Homebrew安装的版本一致,避免因版本差异导致的数据兼容性问题。
- 后续如果需要保留Docker容器的数据,不要删除挂载的本地目录,否则数据会丢失。
内容的提问来源于stack exchange,提问作者Kris

