#!/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