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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.04 17:03:09