Docker挂载PostgreSQL数据目录后容器无响应问题排查求助
在Git Bash终端中操作Docker挂载数据,当前处于2_docker_sql目录,该目录下有ny_taxi_postgres_data子目录(已放入yellow_tripdata_2021-01.csv),执行以下命令后容器无响应,等待半小时无变化,退出时出现错误:
docker run -it \ -e POSTGRES_DB="ny_taxi" \ -e POSTGRES_USER="postgres" \ -e POSTGRES_PASSWORD="postgres" \ -v $(pwd)/ny_taxi_postgres_data:/var/lib/postgresql/data \ -p 5432:5432 \ --name pgdatabase \ postgres:17
正在复现DataTalks ZoomCamp数据工程课程的操作流程。
Git Bash路径解析问题
Git Bash在Windows环境下输出的$(pwd)是Windows格式路径(如C:\xxx\2_docker_sql),Docker无法正确识别这种路径格式,导致挂载失败,容器启动卡住。
解决:将路径转换为Docker可识别的格式,比如用以下命令替换挂载部分:-v "/$(pwd | sed 's/://' | sed 's/\\/\//g')/ny_taxi_postgres_data:/var/lib/postgresql/data"或者手动指定WSL风格的绝对路径,比如
/c/Users/你的用户名/2_docker_sql/ny_taxi_postgres_data。挂载目录权限不足
Windows目录挂载到Docker容器后,Postgres进程(默认使用UID为999的postgres用户)没有读写/var/lib/postgresql/data目录的权限,导致数据库初始化流程卡住。
解决:- 在Windows中右键
ny_taxi_postgres_data目录,选择「属性」-「安全」,添加「Everyone」并赋予读写权限; - 或者先以root用户启动容器,修改目录权限后再切换回postgres用户:
docker run -it \ -e POSTGRES_DB="ny_taxi" \ -e POSTGRES_USER="postgres" \ -e POSTGRES_PASSWORD="postgres" \ -v $(pwd)/ny_taxi_postgres_data:/var/lib/postgresql/data \ -p 5432:5432 \ --name pgdatabase \ --user root \ postgres:17 \ bash -c "chown -R postgres:postgres /var/lib/postgresql/data && exec su postgres -c 'postgres'"
- 在Windows中右键
Postgres版本兼容性
课程可能使用的是较低版本的Postgres(如13或14),而你使用的postgres:17在初始化逻辑或文件结构上有变化,导致与课程操作不兼容。
解决:换成课程中使用的Postgres版本,比如postgres:13重新执行命令。本地端口占用
本地5432端口已被其他Postgres进程或服务占用,容器无法绑定端口导致启动卡住。
解决:- 用命令检查端口占用:
netstat -ano | findstr :5432; - 杀掉占用端口的进程(任务管理器中找到对应PID的进程结束);
- 或者修改端口映射为
-p 5433:5432,避免端口冲突。
- 用命令检查端口占用:
内容的提问来源于stack exchange,提问作者stephr

