如何用单循环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
相关产品推荐
相关产品推荐

