故障问题
docker容器 关机、重启 不能正常停止和恢复
重启后,UI显示异常退出,退出代码255
主要对象
restart: unless-stopped
故障原因和影响
关机时,系统没有优雅处理Docker容器的停止
Docker 守护进程(dockerd)直接被停止,导致容器立即停止,可能引发:
- 未持久化的数据丢失(如内存中的临时数据)
- 数据库事务未提交,造成数据不一致
- 网络连接异常中断,客户端请求失败
- UI报错,看着难受
- 重启无法恢复运行容器
解决方案
分别创建 关机脚本 和 开机脚本
运行用户为root
注:可以使用 应用商店中,Lng、RRorg提供的任务计划,比较简便
关机脚本
#!/bin/bash
# 备份位置
SAVE_FILE="/etc/docker/active_containers.list"
# 获取所有容器ID
RUNNING_IDS=$(docker ps -q)
# 清空记录文件
> "$SAVE_FILE"
if [ -n "$RUNNING_IDS" ]; then
echo "检查容器是否为 unless-stopped"
for ID in $RUNNING_IDS; do
POLICY=$(docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' "$ID")
if [ "$POLICY" == "unless-stopped" ]; then
echo "$ID" >> "$SAVE_FILE"
fi
done
# 优雅停止
docker stop $RUNNING_IDS
fi
开机脚本
#!/bin/bash
# 记录文件
SAVE_FILE="/etc/docker/active_containers.list"
if [ -s "$SAVE_FILE" ]; then
# 将文件内容读取为一行空格分隔的 ID
CONTAINERS_TO_START=$(cat "$SAVE_FILE" | tr '\n' ' ')
if [ -n "$CONTAINERS_TO_START" ]; then
echo "正在启动 unless-stopped 容器"
docker start $CONTAINERS_TO_START
else
echo "没有需要启动的 unless-stopped 容器"
fi
# 不清空 正常关机才清空 避免意外断 电没数据
# > "$SAVE_FILE"
fi
效果预览


