Ubuntu18.04下访问Docker挂载的PostgreSQL10.9数据库失败求助
解决主机PostgreSQL访问Docker数据卷的问题
首先得说清楚:你现在是把两个完全独立的PostgreSQL实例(主机本地安装的和Docker容器里的)的存储目录混在一起操作了,直接改主机PG的data_directory指向Docker的数据卷肯定会出问题——毕竟两个实例的运行上下文、权限配置都不一样,报错里的socket问题只是表象。
下面给你两种解决方案,优先推荐第一种,安全又简单:
方案一:直接连接Docker容器里的PostgreSQL服务
这是最合理的做法,毕竟Docker里的PG本身就是一个独立的服务,直接连它就行:
- 先确认Docker容器里的PG是否在运行:
看输出里postgres服务的状态是不是docker-compose psUp,如果是Exit的话先启动它:docker-compose up -d postgres - 连接容器里的PG有两种方式:
- 进入容器内部操作:直接用docker-compose exec进入容器,然后切换到postgres用户执行psql:
docker-compose exec postgres sudo -u postgres psql - 从主机直接远程连接:如果你的docker-compose.yml里已经配置了端口映射(比如
ports: - "5432:5432"),直接在主机终端用psql连接:
如果没配置端口映射,先打开docker-compose.yml,在postgres服务下加上psql -h localhost -p 5432 -U <你的PG用户名> -d <要连接的数据库名>ports: - "5432:5432",然后重启容器:docker-compose down && docker-compose up -d
- 进入容器内部操作:直接用docker-compose exec进入容器,然后切换到postgres用户执行psql:
方案二:让主机PG使用Docker的数据卷(不推荐,风险高)
如果你非要让主机的PG读取Docker的数据卷,一定要注意:绝对不能同时运行主机PG和Docker PG,否则会直接损坏数据库数据。步骤如下:
- 先停掉两边的PG服务:
# 停止主机的PostgreSQL sudo systemctl stop postgresql # 停止Docker里的PG容器 docker-compose stop postgres - 调整数据卷目录的权限,让主机的postgres用户能访问:
- 先查主机postgres用户的UID/GID:
Ubuntu18.04里一般是UID=100, GID=100id postgres - 修改数据卷目录的权限:
sudo chown -R postgres:postgres /my_absolute_path/database sudo chmod -R 700 /my_absolute_path/database
- 先查主机postgres用户的UID/GID:
- 修正主机PG的配置:
- 打开
/etc/postgresql/10/main/postgresql.conf,确认data_directory确实指向/my_absolute_path/database - 检查
unix_socket_directories参数,确保包含/var/run/postgresql(这是报错里socket所在的目录),如果没有就加上:unix_socket_directories = '/var/run/postgresql,/tmp' - 另外,把数据卷里的
pg_hba.conf复制到主机的/etc/postgresql/10/main/目录,替换原来的文件(因为Docker里的PG配置和主机的可能不一样):sudo cp /my_absolute_path/database/pg_hba.conf /etc/postgresql/10/main/ sudo chown postgres:postgres /etc/postgresql/10/main/pg_hba.conf
- 打开
- 启动主机的PG服务:
sudo systemctl start postgresql - 现在尝试连接:
sudo -u postgres psql
重要提醒
第二种方法只适合临时调试,生产环境绝对不要这么做——PostgreSQL完全不支持多个实例共享同一个数据目录,哪怕不同时运行也容易因为配置差异导致数据问题,优先用方案一就好。
内容的提问来源于stack exchange,提问作者gongarek
相关产品推荐
相关产品推荐

