运行PostgreSQL Docker Compose服务时Socket连接错误排查求助
错误原因分析
你遇到的socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory错误,主要由以下问题导致:
unix_socket_directories参数配置错误:该参数要求传入的是socket文件所在的目录路径,而非socket文件本身。你配置的'/var/run/postgresql/.s.PGSQL.5432'是socket文件的完整路径,PostgreSQL会尝试将其作为目录创建socket,直接导致创建失败,socket文件无法生成。配置文件挂载路径错误:
postgres:15.2-alpine镜像的默认配置文件路径是/var/lib/postgresql/data/postgresql.conf,而你挂载到了/etc/postgresql/postgresql.conf——这个路径是Debian/Ubuntu发行版中PostgreSQL包的默认路径,Alpine镜像并不使用这个位置,导致容器内的PostgreSQL根本没加载到你的自定义配置。配置文件权限问题(潜在隐患):如果本地的
postgresql.conf文件权限不是容器内postgres用户(UID通常为999)可读取的,PostgreSQL启动时会加载配置失败,进而导致服务异常,socket无法创建。
修复步骤
1. 修正postgresql.conf配置
将unix_socket_directories改为正确的目录路径,比如容器内默认存在的目录:
listen_addresses = '*' unix_socket_directories = '/var/run/postgresql'
PostgreSQL会自动在该目录下创建.s.PGSQL.5432 socket文件。
2. 调整Docker Compose的挂载路径
修改docker-compose.yml中配置文件的挂载目标路径:
db: image: postgres:15.2-alpine container_name: postgresql restart: on-failure environment: POSTGRES_USER: "${DB_USER}" POSTGRES_PASSWORD: "${DB_PASS}" POSTGRES_DB: "${DB_NAME}" volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql - ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf ports: - "5432:5432"
3. 修复配置文件权限
在本地执行命令,将postgresql.conf的权限改为容器内postgres用户可读取:
chown 999:999 ./postgresql.conf
4. 重启服务
停止现有容器并重新启动:
docker-compose down docker-compose up -d
内容的提问来源于stack exchange,提问作者Noa

