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

如何以分离模式启动Docker Compose并持续流式输出日志至服务健康或失败?

解决方案

直接用bash脚本结合Docker Compose原生命令就能实现,不用低效的轮询日志。核心思路是后台启动服务后,实时流式输出日志,同时并行检查服务健康状态,一旦所有服务就绪或出现失败就终止日志输出。

#!/bin/bash

# 后台启动所有服务
docker-compose up -d

# 启动日志流式输出,后台运行并记录进程ID
docker-compose logs -f &
LOG_PID=$!

# 定义检查服务健康状态的函数
check_services_health() {
  # 遍历所有服务
  for service in $(docker-compose config --services); do
    # 获取容器ID
    container_id=$(docker-compose ps -q $service)
    # 检查容器是否在运行
    if ! docker inspect --format='{{.State.Running}}' "$container_id" | grep -q true; then
      return 1
    fi
    # 检查健康状态(仅针对配置了healthcheck的服务)
    health_status=$(docker inspect --format='{{.State.Health.Status}}' "$container_id" 2>/dev/null)
    if [ "$health_status" = "unhealthy" ]; then
      return 1
    fi
  done
  # 所有服务健康/运行中,返回成功
  return 0
}

# 循环检查健康状态,间隔2秒
while true; do
  if check_services_health; then
    echo "所有服务已就绪"
    # 终止日志进程
    kill $LOG_PID
    exit 0
  else
    # 检查是否有服务启动失败(已退出)
    if docker-compose ps | grep -q "Exit"; then
      echo "发现服务启动失败,终止日志输出"
      kill $LOG_PID
      exit 1
    fi
    sleep 2
  fi
done

关键说明

  • docker-compose up -d:后台启动所有服务,不阻塞脚本执行
  • docker-compose logs -f &:将日志流式输出放到后台,同时记录进程ID,方便后续按需终止
  • 健康检查逻辑:通过docker inspect直接获取容器的运行状态和健康状态,比单纯轮询docker-compose ps输出更准确,还兼容未配置healthcheck的服务(仅检查是否运行)
  • 一旦检测到所有服务就绪,或者有服务退出失败,立即终止日志进程并退出脚本,避免无意义的持续日志输出

内容的提问来源于stack exchange,提问作者Alexander Leontev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:52:37