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

Ubuntu18.04下访问Docker挂载的PostgreSQL10.9数据库失败求助

解决主机PostgreSQL访问Docker数据卷的问题

首先得说清楚:你现在是把两个完全独立的PostgreSQL实例(主机本地安装的和Docker容器里的)的存储目录混在一起操作了,直接改主机PG的data_directory指向Docker的数据卷肯定会出问题——毕竟两个实例的运行上下文、权限配置都不一样,报错里的socket问题只是表象。

下面给你两种解决方案,优先推荐第一种,安全又简单:


方案一:直接连接Docker容器里的PostgreSQL服务

这是最合理的做法,毕竟Docker里的PG本身就是一个独立的服务,直接连它就行:

  1. 先确认Docker容器里的PG是否在运行:
    docker-compose ps
    
    看输出里postgres服务的状态是不是Up,如果是Exit的话先启动它:docker-compose up -d postgres
  2. 连接容器里的PG有两种方式:
    • 进入容器内部操作:直接用docker-compose exec进入容器,然后切换到postgres用户执行psql:
      docker-compose exec postgres sudo -u postgres psql
      
    • 从主机直接远程连接:如果你的docker-compose.yml里已经配置了端口映射(比如ports: - "5432:5432"),直接在主机终端用psql连接:
      psql -h localhost -p 5432 -U <你的PG用户名> -d <要连接的数据库名>
      
      如果没配置端口映射,先打开docker-compose.yml,在postgres服务下加上ports: - "5432:5432",然后重启容器:docker-compose down && docker-compose up -d

方案二:让主机PG使用Docker的数据卷(不推荐,风险高)

如果你非要让主机的PG读取Docker的数据卷,一定要注意:绝对不能同时运行主机PG和Docker PG,否则会直接损坏数据库数据。步骤如下:

  1. 先停掉两边的PG服务:
    # 停止主机的PostgreSQL
    sudo systemctl stop postgresql
    # 停止Docker里的PG容器
    docker-compose stop postgres
    
  2. 调整数据卷目录的权限,让主机的postgres用户能访问:
    • 先查主机postgres用户的UID/GID:
      id postgres
      
      Ubuntu18.04里一般是UID=100, GID=100
    • 修改数据卷目录的权限:
      sudo chown -R postgres:postgres /my_absolute_path/database
      sudo chmod -R 700 /my_absolute_path/database
      
  3. 修正主机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
      
  4. 启动主机的PG服务:
    sudo systemctl start postgresql
    
  5. 现在尝试连接:
    sudo -u postgres psql
    

重要提醒

第二种方法只适合临时调试,生产环境绝对不要这么做——PostgreSQL完全不支持多个实例共享同一个数据目录,哪怕不同时运行也容易因为配置差异导致数据问题,优先用方案一就好。

内容的提问来源于stack exchange,提问作者gongarek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:37:17