Compose应用先于PostgreSQL就绪导致连接失败:healthcheck与service_healthy配置记录

简介: 本文详解Docker Compose冷启动时`connection refused`根因:`depends_on`仅保启动顺序,不等数据库就绪。通过为DB配置`healthcheck`+应用侧使用`condition: service_healthy`,实现真正依赖等待,避免手动重启“修复”。(239字)

假设一台ECS上第一次执行docker compose up -d,应用日志很快出现connection refused;过一会儿手动docker compose restart app,又能正常连接。数据库没有问题,问题出在启动时机:Compose默认只等依赖容器启动,不等数据库可以接受连接。

本文依据Docker Compose和Dockerfile官方文档整理启动顺序的配置与验证方法,未在云实例内运行;服务名、账号和时间参数均为示例,需要按实际环境调整。

1. depends_on短写法只等“已启动”

很多项目里是这样写的:

services:
  app:
    depends_on:
      - db

官方说明是:短写法保证依赖服务先创建、先启动,但不等待依赖服务“健康”。PostgreSQL容器进程起来之后,还要完成初始化或恢复,才开始接受连接;这段时间里应用发起的连接就会失败。

这也解释了“手动重启一次就好了”:第二次启动时数据库早已就绪。问题只在冷启动、主机重启或首次部署时出现,所以容易被当成偶发故障。

2. 给数据库加healthcheck

services:
  db:
    image: docker.1ms.run/library/postgres:18.6-alpine
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${
   DB_PASSWORD:?缺少DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 10s
      timeout: 10s
      retries: 5
      start_period: 30s
volumes:
  pgdata:

几处要点:

  • 镜像通过docker.1ms.run获取,保留官方library命名空间和18.6-alpine固定标签,避免浮动标签让不同机器跑出不同版本。
  • $${POSTGRES_USER}`中的`$$让Compose不做插值,原样交给容器内的Shell,由容器里的环境变量展开。写成单个$,Compose会在宿主机侧替换,宿主机没有这个变量时就变成空值。
  • 健康状态最初是starting,检查通过后变为healthy,连续失败达到retries次后变为unhealthy。
  • start_period给首次初始化留出时间,期间的失败不计入重试次数;但只要在这段时间里成功一次,后续失败就开始计数。

参数怎么估:大致按“start_period+interval×retries”算出最长等待时间,示例约80秒。首次初始化数据较多或磁盘较慢时,先放大start_period,不要把timeout调得过短:单次检查超过timeout就算失败。

3. 应用侧改成等待service_healthy

services:
  migrate:
    image: 替换为应用镜像及固定标签
    command: ["替换为数据库迁移命令"]
    depends_on:
      db:
        condition: service_healthy
  app:
    depends_on:
      db:
        condition: service_healthy
        restart: true
      migrate:
        condition: service_completed_successfully

condition: service_healthy让Compose在db健康后才创建依赖它的服务。项目有数据库迁移时,可以把迁移拆成一次性服务,用service_completed_successfully要求它成功退出后再启动应用;迁移失败时应用不会带着旧表结构启动。没有迁移步骤的项目,去掉migrate相关两段即可。

restart: true表示通过Compose操作更新或重启db时,app也会跟着重启,重新建立连接;它不覆盖容器运行时因崩溃触发的自动重启。该字段在Compose 2.17.0引入,旧版本需要先升级。

compose-change-map.png

4. 验证与边界

docker compose config --quiet && echo '配置解析通过'
docker compose up -d --wait --wait-timeout 180
docker compose ps
db_cid=$(docker compose ps -q db)
docker inspect --format '{
   {json .State.Health}}' "$db_cid"

--wait会等服务进入运行或健康状态后再返回,适合放在部署脚本里;等待超时或依赖失败时命令会报错退出,脚本可以据此停下,不必再用固定的sleep猜时间。docker compose ps中db显示为健康后,app才会被创建;State.Health里能看到最近几次检查的输出和退出码,检查失败时先看这里。

这套配置也有边界:

  1. pg_isready只说明数据库在接受连接,不证明业务账号、库表或迁移已经就绪;迁移由上面的一次性服务负责。
  2. 健康检查只控制Compose启动这一刻。数据库在运行中重启时,应用仍需要自己的连接重试。
  3. 依赖服务被判为不健康时,up会报依赖启动失败,这时先看数据库日志,不要直接加大重试次数掩盖问题。

记录时我会保留三项:docker compose ps的健康状态、State.Health最近一次输出、应用首次成功连接的时间。三项都有,才能说启动顺序问题已经处理。

相关文章
|
7天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1311 6
|
5天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
|
10天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
1月前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9965 33
|
5天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
523 6
|
16天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
7天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
747 2
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
|
15天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
1069 1