如何以分离模式启动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
相关产品推荐
相关产品推荐

