回到笔记Docker Compose 服务依赖与健康检查让 API 在 MySQL 真正可用后再启动:为数据库配置 healthcheck,并用 depends_on 的 service_healthy 条件建立依赖。 2025年4月23日 1 分钟阅读收听本文 Microsoft Edge 神经语音容器已经启动,不代表容器里的服务已经可用。数据库还在初始化时,如果 API 立刻发起连接,通常会得到一次没有必要的启动失败。 Docker Compose 可以用 healthcheck 描述“服务真正准备好了”的条件,再让依赖方等待这个状态。 为 MySQL 配置健康检查 services: mysql: image: mysql:latest container_name: mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} volumes: - ./volumes/mysql:/var/lib/mysql ports: - "3306:3306" healthcheck: test: [ "CMD-SHELL", "mysqladmin ping -h localhost -u root -p$${MYSQL_ROOT_PASSWORD}", ] interval: 10s timeout: 5s retries: 10 start_period: 20s 让 API 等待数据库 api: container_name: api build: context: api dockerfile: Dockerfile command: [ "sh", "-c", "python -m script.init_sql_base_data && fastapi run main.py --proxy-headers --host 0.0.0.0 --port 8001", ] volumes: - ./api:/app depends_on: mysql: condition: service_healthy env_file: - ./api/.env.development 这里真正起作用的是 condition: service_healthy。它等待的是健康检查通过,而不是 MySQL 容器进入 running 状态。 [!NOTE] 健康检查解决的是启动顺序,不替代应用自身的重试机制。生产环境里,API 仍然应该处理数据库短暂断线和重连。 交流留下你的想法评论由 GitHub Issues 托管,中英文页面共享同一段讨论。正在载入评论…
容器已经启动,不代表容器里的服务已经可用。数据库还在初始化时,如果 API 立刻发起连接,通常会得到一次没有必要的启动失败。
Docker Compose 可以用
healthcheck描述“服务真正准备好了”的条件,再让依赖方等待这个状态。为 MySQL 配置健康检查
让 API 等待数据库
这里真正起作用的是
condition: service_healthy。它等待的是健康检查通过,而不是 MySQL 容器进入running状态。