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

如何用单循环Bash脚本启动未运行Docker容器并获取健康反馈?

Docker容器批量重启优化方案

在性能较弱的ARM64单板计算机(SBC)上运行Docker时,系统重启后部分容器会随机无法启动,但延迟启动即可正常运行。目前使用两段Bash循环分别重启状态为exited和created的容器,原脚本如下:

items=$(docker ps -a -q -f status=exited)
for word in $items
do
    docker restart $word
    sleep 10
done

items=$(docker ps -a -q -f status=created)
for word in $items
do
    docker restart $word
    sleep 10
done

需求为:将两个循环合并为单循环(不清楚如何在docker ps的状态筛选中使用OR逻辑),同时获取容器是否健康运行的反馈。


优化后的合并脚本

Docker的ps命令支持重复使用-f参数实现多条件OR筛选,结合docker inspect可获取容器的运行及健康状态反馈。优化后的脚本如下:

# 一次性筛选状态为exited或created的容器ID,遍历处理
for container_id in $(docker ps -a -q -f status=exited -f status=created); do
    echo "正在重启容器: $container_id"
    # 执行重启操作
    docker restart "$container_id"
    # 适配ARM64 SBC性能,预留启动延迟
    sleep 10
    
    # 获取容器当前运行状态
    container_status=$(docker inspect -f '{{.State.Status}}' "$container_id")
    # 获取容器健康状态(未配置健康检查的容器会返回提示)
    health_status=$(docker inspect -f '{{.State.Health.Status}}' "$container_id" 2>/dev/null || echo "未配置健康检查")
    
    echo "容器 $container_id 运行状态: $container_status | 健康状态: $health_status"
    echo "----------------------------------------"
done

核心细节说明

  • 多状态筛选逻辑:重复使用-f status=xxx参数,Docker会自动将多个状态条件视为OR关系,一次性拿到所有目标容器的ID
  • 状态反馈机制:
    • 通过docker inspect的{{.State.Status}}字段获取容器基础运行状态(如running、exited)
    • 针对配置了健康检查的容器,通过{{.State.Health.Status}}获取健康状态(如healthy、unhealthy),未配置的容器会输出提示信息
  • 性能适配:保留sleep 10以适配ARM64 SBC的性能瓶颈,确保容器有足够时间完成启动流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:46:03