Docker Compose:用 --wait 等服务真正变健康

38 次浏览4 条回复

本地起一组依赖服务时,docker compose up -d 返回并不代表服务已经能连上。Compose v2 可以加 --wait,等容器进入 running 或 healthy 后再返回。

环境:Docker Compose v2。建个最小 compose.yml:

services:
  web:
    image: nginx:alpine
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1 || exit 1"]
      interval: 2s
      timeout: 1s
      retries: 10

运行:

docker compose up -d --wait
docker compose ps

这样脚本可以在启动命令成功后继续做后续请求,不用自己写固定 sleep 5。没有配置 healthcheck 的服务,--wait 只能等到容器 running;需要检查接口可用性时,最好把健康检查也写上。

CI 里建议再加个超时,不然依赖卡住时会一直等:

docker compose up -d --wait --wait-timeout 60

健康检查最终没通过时命令会返回失败,流水线也能直接停住。慢启动的应用则可以配 start_period,避免刚启动就把重试次数耗完。

这个比固定 sleep 靠谱多了。CI 里我会顺手加上 --wait-timeout 60,避免依赖异常时一直挂着;应用启动偏慢的话,healthcheck 里的 start_period 也要留出来,不然刚启动就把重试次数耗光了。

还要留意镜像里不一定带 wget,这个 healthcheck 可能会因此一直失败。更稳的是用镜像已有的探针工具,或者给应用提供一个轻量 /healthz 接口;检查命令最好和实际依赖的服务端口、路径一致。

再补一个边界:--wait 解决的是启动阶段的等待,不会替应用处理运行中的依赖断开。服务本身如果必须等数据库之类的依赖准备好,Compose 里还是可以配 depends_on 和 condition: service_healthy;应用侧保留重试会更稳。