Docker Compose中Postgres实例突发故障排查求助
Postgres Docker Compose健康检查失败:命令格式错误问题
问题根源
你的Postgres服务健康检查配置格式错误——在使用数组形式的CMD时,必须把命令和每个参数拆成独立的数组元素。当前配置里["CMD", "pg_isready -d $POSTGRES_DB"]会让Docker把整个字符串pg_isready -d $POSTGRES_DB当作一个可执行文件去查找,自然找不到,这就是报错的核心原因。
验证依据
从你提供的命令输出可以明确这点:
docker inspect的健康日志显示,Docker在尝试寻找名为pg_isready -d microblog的可执行文件,而非执行pg_isready命令并传递参数。- 直接用
docker exec执行pg_isready -d $POSTGRES_DB能成功,说明命令本身在容器内完全可用,只是健康检查的格式不符合Docker的解析规则。
修复方案
修改db服务的healthcheck.test配置,将命令与参数拆分为独立数组元素:
services: db: image: postgres:18 restart: always ports: - "5432:5432" environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?} POSTGRES_DB: ${POSTGRES_DB:?} healthcheck: test: ["CMD", "pg_isready", "-d", "$POSTGRES_DB"] # 拆分命令与参数 interval: 10s timeout: 5s retries: 5 shm_size: 128mb redis: image: redis restart: always entrypoint: redis-server --save 20 1 --loglevel warning ports: - 6379:6379 volumes: - redis_data:/usr/share/redis/data volumes: redis_data: driver: local
也可以改用shell格式的写法(会通过容器内的shell解析变量和参数):
healthcheck: test: "pg_isready -d $POSTGRES_DB" interval: 10s timeout: 5s retries: 5
关于“突然失效”的可能原因
- Docker版本升级后,健康检查的参数解析逻辑变得更严格,之前的错误写法在旧版本中被兼容处理,新版本不再支持。
postgres:18镜像有更新推送,内部环境变化触发了这个格式问题(即使标签是18,镜像本身可能会迭代更新)。
修复后执行docker-compose up -d重启服务,健康检查即可恢复正常。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

