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
相关产品推荐
相关产品推荐

