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不匹配,触发安全关机机制。
解决步骤
停止并清理现有容器
先停止所有相关容器,避免进程残留:docker-compose down -v停止本地主机的PostgreSQL服务
彻底停止本地PostgreSQL服务,确保没有进程占用数据目录:brew services stop postgresql@15检查并终止残留进程:
ps aux | grep postgres kill -9 <残留的PostgreSQL进程PID>清理冲突的PID文件
删除本地目录下的postmaster.pid文件:rm /opt/homebrew/var/postgresql@15/postmaster.pid修改挂载配置(推荐方案)
不要直接挂载本地已使用的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:重新启动应用
docker-compose up -d
可选:若必须挂载本地目录
如果一定要使用本地目录,需确保:
- 本地PostgreSQL服务完全停止且无任何残留进程
- 本地目录未被其他进程占用
- 启动容器前彻底删除本地目录下的
postmaster.pid、pg_log等残留文件
内容的提问来源于stack exchange,提问作者Артём
相关产品推荐
相关产品推荐

