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

Docker部署PostgreSQL出现postmaster.pid PID不匹配问题求助

问题:PostgreSQL容器因postmaster.pid PID不匹配停止运行

通过docker-compose.yml启动应用后,初始运行正常,但数分钟后database容器因报错lock file "postmaster.pid" contains wrong PID: 8234 instead of 1停止。已尝试删除容器内的postmaster.pid文件,参考相关方案后仍未解决。


已添加的本地PostgreSQL配置

postgresql.conf(路径:/opt/homebrew/var/postgresql@15)

# Add settings for extensions here
listen_addresses = '*'

pg_hba.conf(路径:/opt/homebrew/var/postgresql@15)

host    movies_database    app    0.0.0.0/0    md5

相关文件内容及容器日志

/opt/homebrew/var/postgresql@15/postmaster.pid

8111
/opt/homebrew/var/postgresql@15
1715706343
5432
/tmp
*
936360   3407872
ready  

/var/lib/postgresql/data/postmaster.pid(容器内路径)

8234
/opt/homebrew/var/postgresql@15
1715706583
5432
/tmp
*
936360   3473408
ready 

Docker容器日志

database-1     | 2024-05-14 19:32:32.038 [1] LOG:  lock file "postmaster.pid" contains wrong PID: 8234 instead of 1
database-1     | 2024-05-14 19:32:32.038 [1] LOG:  performing immediate shutdown because data directory lock file is invalid
database-1     | 2024-05-14 19:32:32.038 [1] LOG:  received immediate shutdown request
database-1     | 2024-05-14 19:32:32.056 [1] LOG:  database system is shut down
database-1 exited with code 0

docker-compose.yml

version: '3.8' 
  
services:
  django:
    build:
      context: .
    volumes:
      - "./movies_admin:/movies_admin"
    env_file:
      - "movies_admin/config/.env"
    depends_on:
      - database
      - elasticsearch
  
  database:
    image: postgres:15.7
    environment:
      - POSTGRES_DB=movies_database
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=123qwe
    volumes:
      - /opt/homebrew/var/postgresql@15:/var/lib/postgresql/data 
  
  nginx:
    image: nginx:latest
    container_name: nginx
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/default.conf:/etc/nginx/conf.d/default.conf"
      - "./movies_admin/movies_admin/staticfiles/admin:/etc/nginx/movies_admin/movies_admin/staticfiles/admin"
      - "./movies_admin/movies_admin/staticfiles/rest_framework:/etc/nginx/movies_admin/movies_admin/staticfiles/rest_framework"
    ports:
      - "80:80"
    depends_on:
      - django
  
  elasticsearch:
    image: elasticsearch:8.13.0
    container_name: elasticsearch
    environment:
      - "ES_JAVA_OPTS=-Xms200m -Xmx200m"
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - 9200:9200

问题原因及解决方法

核心原因

你把本地主机正在使用的PostgreSQL数据目录/opt/homebrew/var/postgresql@15直接挂载到了容器内的/var/lib/postgresql/data,导致本地和容器内的PostgreSQL进程同时操作同一个数据目录:本地进程生成的PID是8111/8234,而容器内PostgreSQL进程的PID是1,容器启动后检测到PID不匹配,触发安全关机机制。

解决步骤

  1. 停止并清理现有容器
    先停止所有相关容器,避免进程残留:

    docker-compose down -v
    
  2. 停止本地主机的PostgreSQL服务
    彻底停止本地PostgreSQL服务,确保没有进程占用数据目录:

    brew services stop postgresql@15
    

    检查并终止残留进程:

    ps aux | grep postgres
    kill -9 <残留的PostgreSQL进程PID>
    
  3. 清理冲突的PID文件
    删除本地目录下的postmaster.pid文件:

    rm /opt/homebrew/var/postgresql@15/postmaster.pid
    
  4. 修改挂载配置(推荐方案)
    不要直接挂载本地已使用的PostgreSQL数据目录,改用Docker命名卷管理数据,彻底避免进程冲突:
    修改docker-compose.yml中database服务的volumes部分,并添加卷定义:

    services:
      database:
        image: postgres:15.7
        environment:
          - POSTGRES_DB=movies_database
          - POSTGRES_USER=app
          - POSTGRES_PASSWORD=123qwe
        volumes:
          - postgres_data:/var/lib/postgresql/data  # 改用命名卷
    
    # 在文件末尾添加卷定义
    volumes:
      postgres_data:
    
  5. 重新启动应用

    docker-compose up -d
    

可选:若必须挂载本地目录

如果一定要使用本地目录,需确保:

  • 本地PostgreSQL服务完全停止且无任何残留进程
  • 本地目录未被其他进程占用
  • 启动容器前彻底删除本地目录下的postmaster.pid、pg_log等残留文件

内容的提问来源于stack exchange,提问作者Артём

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:25:57