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

Docker Compose中translator服务健康检查持续执行问题咨询

问题:Docker Compose中translator服务健康检查持续调用接口的原因

我使用Docker Compose运行多个服务,其中data-loader服务需等待translator服务就绪后启动,但data-loader启动并执行完成退出后,translator的健康检查仍在持续执行,不断调用/healthcheck接口,且调用次数远超健康检查配置的重试次数,无其他服务或函数调用该接口,推测是Compose中的健康检查导致,请问这是什么原因?

Docker Compose配置

translator:
  build: ./translator
  container_name: translator
  command: uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
  healthcheck:
    test: curl -f translator:8000/healthcheck || exit 1
    interval: 5s
    timeout: 5s
    retries: 5
  env_file:
    - ./translator/.env
  networks:
    - fds-network
  ports:
    - 8000:8000
  restart: always
  depends_on:
    - redis
  volumes:
    - ./translator:/app/

data-loader:
  build:
    context: ./data-loader
    dockerfile: Dockerfile
  container_name: data-loader
  command: python3 app/main.py
  environment:
    - "DOCKER=true"
    - "BASE_LANG=es"
    - "LOAD_DISEASES=false"
  depends_on:
    cassandra-load-keyspace:
      condition: service_completed_successfully
    translator:
      condition: service_healthy
  env_file:
    - ./data-loader/.env
  networks:
    - fds-network

健康检查接口代码

@app.get("/healthcheck")
async def healthcheck():
    return {"status": "ok"}

控制台输出

cassandra-load-keyspace exited with code 0
data-loader              | Dataloader connected to Cassandra
data-loader              | Dataloader started
data-loader              | load diseases False
data-loader              | Skipping disease loading
translator               | INFO:     172.18.0.4:46638 - "GET /healthcheck HTTP/1.1" 200 OK
data-loader exited with code 0
translator               | INFO:     172.18.0.4:56822 - "GET /healthcheck HTTP/1.1" 200 OK
translator               | INFO:     172.18.0.4:56836 - "GET /healthcheck HTTP/1.1" 200 OK
translator               | INFO:     172.18.0.4:40618 - "GET /healthcheck HTTP/1.1" 200 OK
translator               | INFO:     172.18.0.4:40624 - "GET /healthcheck HTTP/1.1" 200 OK
translator               | INFO:     172.18.0.4:51620 - "GET /healthcheck HTTP/1.1" 200 OK
translator               | INFO:     172.18.0.4:51630 - "GET /healthcheck HTTP/1.1" 200 OK

解答

  • 你误解了retries参数的作用:它不是健康检查的总调用次数,而是服务启动阶段,判定健康状态失败后的重试次数。当服务成功进入健康状态后,Docker会按照interval配置的间隔(这里是5秒)持续执行健康检查,直到容器停止。
  • translator服务配置了restart: always,容器会一直运行,因此健康检查会周期性执行,这是Docker的默认行为,和data-loader是否退出没有关系。
  • 如果不需要长期监控服务健康状态,可考虑移除健康检查配置,但这样depends_on中的service_healthy条件就无法使用;若仍需依赖健康状态启动data-loader,可调整健康检查参数,比如增加start_period(给服务启动预留缓冲时间,避免启动初期频繁检查),但无法完全停止健康检查,除非容器停止运行。

内容的提问来源于stack exchange,提问作者Francisco Aguilera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:10:30