68 lines
2.1 KiB
Bash
Executable File
68 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Docker 服务关机前停止脚本
|
||
# 用于在系统重启/关机前优雅地停止所有 Docker 服务
|
||
|
||
echo "$(date): 开始停止 Docker 服务..." | tee -a /var/log/docker-shutdown.log
|
||
|
||
# Docker 服务目录列表(除了 gitea)
|
||
DOCKER_DIRS=(
|
||
"/home/will/docker/caddy"
|
||
"/home/will/docker/navidrome"
|
||
"/home/will/docker/jellyfin"
|
||
"/home/will/docker/1panel"
|
||
"/home/will/docker/silly"
|
||
"/home/will/docker/vault"
|
||
"/home/will/docker/HA"
|
||
"/home/will/docker/clove"
|
||
"/home/will/docker/discord_bot"
|
||
"/home/will/docker/discord_bot/ai_bots"
|
||
"/home/will/docker/adwireguard"
|
||
# "/home/will/docker/backtest" # 手动启动
|
||
)
|
||
|
||
# 函数:优雅停止 Docker Compose 服务
|
||
stop_docker_service() {
|
||
local dir="$1"
|
||
|
||
if [[ -f "$dir/docker-compose.yml" ]]; then
|
||
echo "$(date): 停止服务: $dir" | tee -a /var/log/docker-shutdown.log
|
||
cd "$dir"
|
||
|
||
# 使用 timeout 防止卡住
|
||
timeout 60 docker compose down
|
||
|
||
if [[ $? -eq 0 ]]; then
|
||
echo "$(date): 成功停止: $dir" | tee -a /var/log/docker-shutdown.log
|
||
else
|
||
echo "$(date): 停止失败或超时: $dir" | tee -a /var/log/docker-shutdown.log
|
||
# 强制停止
|
||
docker compose kill
|
||
fi
|
||
else
|
||
echo "$(date): 跳过 (无 docker-compose.yml): $dir" | tee -a /var/log/docker-shutdown.log
|
||
fi
|
||
}
|
||
|
||
# 停止所有服务
|
||
for dir in "${DOCKER_DIRS[@]}"; do
|
||
if [[ -d "$dir" ]]; then
|
||
stop_docker_service "$dir"
|
||
else
|
||
echo "$(date): 目录不存在: $dir" | tee -a /var/log/docker-shutdown.log
|
||
fi
|
||
|
||
# 每个服务之间等待2秒
|
||
sleep 2
|
||
done
|
||
|
||
# 清理孤立的容器和网络
|
||
echo "$(date): 清理孤立的容器和网络..." | tee -a /var/log/docker-shutdown.log
|
||
docker container prune -f
|
||
docker network prune -f
|
||
|
||
# 停止 Docker 守护进程(可选)
|
||
echo "$(date): 停止 Docker 守护进程..." | tee -a /var/log/docker-shutdown.log
|
||
systemctl stop docker
|
||
|
||
echo "$(date): Docker 服务停止完成" | tee -a /var/log/docker-shutdown.log |