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

Docker Compose中PostgreSQL容器因缺失目录启动失败求助

PostgreSQL容器启动失败:/postgres_socket目录缺失问题解决

问题现象

执行docker-compose up后PostgreSQL容器无法启动,日志报错:

FATAL: could not create lock file "/postgres_socket/.s.PGSQL.5432.lock": No such file or directory

已挂载自定义pg.conf配置文件,错误与配置中指定的/postgres_socket目录缺失相关。

当前配置

docker-compose.yml

x-variables: &variables
  ENV_STAGE: local

services:
  profiles:
    build:
      context: .
      dockerfile: compose/dev/web/Dockerfile
    volumes:
      - ./web/:/usr/src/web/
    ports:
      - "8000:8000"
    environment:
      <<: *variables
    env_file:
      - compose/dev/env/.env
      - compose/dev/env/.db.env
      - compose/dev/env/.data.env
    depends_on:
      - postgres
    restart: unless-stopped

  postgres:
    image: postgres:latest
    restart: always
    volumes:
      - ./compose/dev/db/pg.conf:/etc/postgresql/postgresql.conf
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=test
      - PGDATA=/var/lib/postgresql/data
    ports:
      - 5432:5432
    command: postgres -c config_file=/etc/postgresql/postgresql.conf

    env_file:
      - compose/dev/env/.db.env

volumes:
  postgres-data:

pg.conf关键配置

listen_addresses = '0.0.0.0'
unix_socket_directories = '/var/run/postgresql, /postgres_socket'
# 其他配置省略...

已尝试操作

  • 检查Docker Compose卷挂载配置
  • 手动在宿主机创建/postgres_socket目录
  • 验证宿主机目录权限

问题

  1. 如何解决/postgres_socket目录缺失的问题?
  2. 是否需要调整Docker Compose或PostgreSQL配置中的特定设置?

解决思路与方案

根源分析

PostgreSQL启动时会检查unix_socket_directories配置中所有目录是否存在,且运行用户(postgres镜像中为postgres用户,UID=999)拥有读写权限。容器启动时默认不会自动创建/postgres_socket目录,且宿主机创建的目录不会自动同步到容器内(除非挂载关联)。

方案1:简化PostgreSQL配置(推荐,无需额外操作)

如果不需要额外的Unix Socket目录,直接修改pg.conf中的unix_socket_directories,只保留默认存在的目录:

unix_socket_directories = '/var/run/postgresql'

该目录在官方postgres镜像中默认存在且权限正确,修改后重启容器即可。

方案2:容器启动时自动创建目录

修改Docker Compose中postgres服务的command,先创建/postgres_socket目录并设置正确权限,再启动PostgreSQL:

command: >
  sh -c "mkdir -p /postgres_socket && chown postgres:postgres /postgres_socket && postgres -c config_file=/etc/postgresql/postgresql.conf"

此方法会在容器启动阶段自动完成目录创建与权限配置,无需额外宿主机操作。

方案3:挂载宿主机目录到容器

  1. 在宿主机创建对应目录并设置权限:
mkdir -p ./compose/dev/db/postgres_socket
chown 999:999 ./compose/dev/db/postgres_socket
  1. 修改Docker Compose中postgres服务的volumes,添加目录挂载:
volumes:
  - ./compose/dev/db/pg.conf:/etc/postgresql/postgresql.conf
  - ./compose/dev/db/postgres_socket:/postgres_socket

挂载后容器内的/postgres_socket会关联到宿主机目录,启动时目录已存在且权限符合要求。

配置调整建议

  • 若没有特殊需求,优先使用方案1,减少不必要的配置复杂度;
  • 若必须使用自定义socket目录,方案2更适合容器化环境,无需维护宿主机目录权限;
  • 方案3适合需要宿主机直接访问PostgreSQL socket的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:26:10