使用Docker Compose部署PostgreSQL后无法连接,提示postmaster.pid已存在
PostgreSQL Docker容器启动报错:lock file "postmaster.pid" already exists
问题详情
使用docker-compose.yml部署PostgreSQL时,启动后无法连接,出现以下错误:
2022-10-10 11:19:41.820 UTC [43] FATAL: lock file "postmaster.pid" already exists 2022-10-10 11:19:41.820 UTC [43] HINT: Is another postmaster (PID 1) running in data directory "/var/lib/postgresql/data"?
我的docker-compose.yml配置:
version: "3.9" services: db: image: "postgres" restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - '5432:5432' volumes: - /pgdata:/var/lib/postgresql/data
尝试的操作及日志:
我用以下命令尝试连接运行中的容器:
docker exec -it -u postgres 31f122d6a413 postgres
容器日志显示卷冲突警告,且数据库已启动但无法连接:
Recreating test-docker-proj ... WARNING: Service "db" is using volume "/var/lib/postgresql/data" from the previous container. Host mapping "/pgdata" has no effect. Recreating test-docker-proj ... done Attaching to test-docker-proj db_1 | db_1 | PostgreSQL Database directory appears to contain a database; Skipping initialization db_1 | db_1 | 2022-10-10 11:05:02.349 UTC [1] LOG: starting PostgreSQL 14.5 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 11.2.1_git20220219) 11.2.1 20220219, 64-bit db_1 | 2022-10-10 11:05:02.349 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 db_1 | 2022-10-10 11:05:02.349 UTC [1] LOG: listening on IPv6 address "::", port 5432 db_1 | 2022-10-10 11:05:02.352 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2022-10-10 11:05:02.356 UTC [22] LOG: database system was shut down at 2022-10-10 10:47:01 UTC db_1 | 2022-10-10 11:05:02.361 UTC [1] LOG: database system is ready to accept connections
运行环境:
- Mac Monterey M1
- docker-compose version 1.29.2
补充:可以用/bin/sh连接容器,但无法用postgres命令连接。
解决方案
1. 清理旧容器及关联卷
日志中的卷冲突警告说明之前的匿名卷未被清理,导致宿主机目录映射失效。执行以下命令彻底清理:
docker-compose down -v
-v参数会删除容器关联的所有卷,确保下次启动使用新的卷配置。
2. 删除残留的postmaster.pid锁文件
如果宿主机的/pgdata目录中残留了锁文件,手动删除:
sudo rm /pgdata/postmaster.pid
如果是容器内的卷残留,先进入容器再删除:
docker exec -it -u postgres <容器ID> /bin/sh rm /var/lib/postgresql/data/postmaster.pid exit docker-compose restart
3. 优化Volume配置(推荐)
Mac上直接使用绝对路径/pgdata可能存在权限问题,建议改用Docker命名卷管理数据:
version: "3.9" services: db: image: "postgres" restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - '5432:5432' volumes: - pgdata:/var/lib/postgresql/data # 定义命名卷 volumes: pgdata:
命名卷由Docker自动管理,权限适配更友好。
4. 正确连接容器内的PostgreSQL
你使用的postgres命令是启动数据库服务的,而容器内已有运行的实例,应该用客户端工具psql连接:
# 方式1:指定用户进入psql docker exec -it -u postgres <容器ID> psql # 方式2:直接指定用户和数据库 docker exec -it <容器ID> psql -U postgres
内容的提问来源于stack exchange,提问作者sobmortin354
相关产品推荐
相关产品推荐

