forked from zhouxiaoka/autoclip
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-stop.sh
More file actions
executable file
·225 lines (185 loc) · 5.86 KB
/
docker-stop.sh
File metadata and controls
executable file
·225 lines (185 loc) · 5.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#!/bin/bash
# AutoClip Docker 停止脚本
# 版本: 1.0
# 功能: 停止AutoClip Docker服务
set -euo pipefail
# =============================================================================
# 配置区域
# =============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
# 图标定义
ICON_SUCCESS="✅"
ICON_ERROR="❌"
ICON_WARNING="⚠️"
ICON_INFO="ℹ️"
ICON_STOP="🛑"
# =============================================================================
# 工具函数
# =============================================================================
log_info() {
echo -e "${BLUE}${ICON_INFO} $1${NC}"
}
log_success() {
echo -e "${GREEN}${ICON_SUCCESS} $1${NC}"
}
log_warning() {
echo -e "${YELLOW}${ICON_WARNING} $1${NC}"
}
log_error() {
echo -e "${RED}${ICON_ERROR} $1${NC}"
}
log_header() {
echo -e "\n${PURPLE}${ICON_STOP} $1${NC}"
echo -e "${PURPLE}$(printf '=%.0s' {1..50})${NC}"
}
# =============================================================================
# 停止函数
# =============================================================================
stop_services() {
log_header "停止AutoClip服务"
local mode="${1:-production}"
local compose_file="docker-compose.yml"
if [[ "$mode" == "dev" ]]; then
compose_file="docker-compose.dev.yml"
fi
log_info "停止服务 (模式: $mode)..."
# 停止服务
if docker-compose -f "$compose_file" down; then
log_success "服务已停止"
else
log_error "停止服务失败"
exit 1
fi
}
cleanup_containers() {
log_header "清理容器"
# 停止所有相关容器
local containers=$(docker ps -a --filter "name=autoclip" --format "{{.Names}}" 2>/dev/null || true)
if [[ -n "$containers" ]]; then
log_info "发现以下AutoClip容器:"
echo "$containers"
if [[ "${1:-}" == "--force" ]]; then
log_info "强制停止所有容器..."
echo "$containers" | xargs docker stop 2>/dev/null || true
echo "$containers" | xargs docker rm 2>/dev/null || true
log_success "容器清理完成"
else
log_warning "使用 --force 参数强制清理容器"
fi
else
log_success "没有发现AutoClip容器"
fi
}
cleanup_images() {
log_header "清理镜像"
if [[ "${1:-}" == "--force" ]]; then
log_info "清理未使用的镜像..."
docker image prune -f
log_success "镜像清理完成"
else
log_info "使用 --force 参数清理未使用的镜像"
fi
}
cleanup_volumes() {
log_header "清理数据卷"
if [[ "${1:-}" == "--force" ]]; then
log_warning "这将删除所有数据,包括项目文件和数据库!"
read -p "确定要继续吗?(y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
log_info "清理数据卷..."
docker volume prune -f
log_success "数据卷清理完成"
else
log_info "取消清理数据卷"
fi
else
log_info "使用 --force 参数清理未使用的数据卷"
fi
}
show_status() {
log_header "当前状态"
echo -e "${BLUE}📊 容器状态:${NC}"
docker-compose ps 2>/dev/null || echo " 没有运行的服务"
echo -e "\n${BLUE}🐳 AutoClip相关容器:${NC}"
docker ps -a --filter "name=autoclip" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || echo " 没有发现相关容器"
echo -e "\n${BLUE}💾 数据卷:${NC}"
docker volume ls --filter "name=autoclip" --format "table {{.Name}}\t{{.Driver}}\t{{.Size}}" 2>/dev/null || echo " 没有发现相关数据卷"
}
# =============================================================================
# 主函数
# =============================================================================
main() {
local mode="production"
local cleanup=false
local force=false
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
"dev")
mode="development"
shift
;;
"--cleanup")
cleanup=true
shift
;;
"--force")
force=true
shift
;;
"help"|"-h"|"--help")
show_help
exit 0
;;
*)
log_error "未知参数: $1"
show_help
exit 1
;;
esac
done
log_header "AutoClip Docker 停止器 v1.0"
# 停止服务
stop_services "$mode"
# 清理(如果需要)
if [[ "$cleanup" == true ]]; then
cleanup_containers "$force"
cleanup_images "$force"
cleanup_volumes "$force"
fi
# 显示状态
show_status
echo -e "\n${GREEN}🎉 AutoClip Docker 服务已停止${NC}"
}
# 显示帮助信息
show_help() {
echo "AutoClip Docker 停止脚本"
echo ""
echo "用法:"
echo " $0 [选项]"
echo ""
echo "选项:"
echo " dev 停止开发环境"
echo " --cleanup 停止后清理资源"
echo " --force 强制清理(包括数据)"
echo " help 显示帮助信息"
echo ""
echo "示例:"
echo " $0 # 停止生产环境"
echo " $0 dev # 停止开发环境"
echo " $0 --cleanup # 停止并清理资源"
echo " $0 --cleanup --force # 停止并强制清理所有资源"
echo " $0 help # 显示帮助"
echo ""
echo "注意:"
echo " --force 参数会删除所有数据,请谨慎使用!"
}
# 运行主函数
main "$@"