Files
bookstore/docker-manage.sh
bruno f4cb490d41
Optimized CI/CD Pipeline / validate-and-test (push) Failing after 1s
Optimized CI/CD Pipeline / build-and-deploy (push) Has been skipped
Fast CI/CD Pipeline / fast-build (push) Failing after 16m56s
Fast CI/CD Pipeline / build-and-deploy (push) Has been skipped
commit to github
2025-12-19 06:47:14 +08:00

213 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
# Docker服务管理脚本
COMPOSE_FILE="docker-compose-full.yml"
# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
show_help() {
echo "=================================================="
echo "🐳 Docker服务管理脚本"
echo "=================================================="
echo ""
echo "用法: ./docker-manage.sh [命令]"
echo ""
echo "可用命令:"
echo " start 启动所有服务"
echo " stop 停止所有服务"
echo " restart 重启所有服务"
echo " status 查看服务状态"
echo " logs [服务] 查看日志 (可选指定服务名)"
echo " health 检查健康状态"
echo " clean 停止并删除所有容器和卷"
echo " rebuild 重新构建并启动"
echo " shell [服务] 进入容器shell"
echo ""
echo "服务名称:"
echo " mysql, redis, opensearch, opensearch-dashboards, bookstore-app"
echo ""
}
start_services() {
echo -e "${BLUE}🚀 启动所有Docker服务...${NC}"
docker-compose -f $COMPOSE_FILE up -d
echo ""
echo -e "${GREEN}✅ 服务启动完成!${NC}"
echo ""
show_status
}
stop_services() {
echo -e "${YELLOW}⏸️ 停止所有Docker服务...${NC}"
docker-compose -f $COMPOSE_FILE stop
echo -e "${GREEN}✅ 服务已停止${NC}"
}
restart_services() {
echo -e "${YELLOW}🔄 重启所有Docker服务...${NC}"
docker-compose -f $COMPOSE_FILE restart
echo -e "${GREEN}✅ 服务重启完成${NC}"
echo ""
show_status
}
show_status() {
echo -e "${BLUE}📊 服务状态:${NC}"
docker-compose -f $COMPOSE_FILE ps
}
show_logs() {
if [ -z "$1" ]; then
echo -e "${BLUE}📜 查看所有服务日志 (Ctrl+C 退出):${NC}"
docker-compose -f $COMPOSE_FILE logs -f
else
echo -e "${BLUE}📜 查看 $1 服务日志 (Ctrl+C 退出):${NC}"
docker-compose -f $COMPOSE_FILE logs -f $1
fi
}
check_health() {
echo -e "${BLUE}🏥 检查服务健康状态:${NC}"
echo ""
# 检查MySQL
echo -n "MySQL: "
if docker exec bookstore-mysql mysqladmin ping -h localhost -uroot -p123456 2>/dev/null | grep -q "mysqld is alive"; then
echo -e "${GREEN}✅ Healthy${NC}"
else
echo -e "${RED}❌ Unhealthy${NC}"
fi
# 检查Redis
echo -n "Redis: "
if docker exec bookstore-redis redis-cli -a 123456 --no-auth-warning ping 2>/dev/null | grep -q PONG; then
echo -e "${GREEN}✅ Healthy${NC}"
else
echo -e "${RED}❌ Unhealthy${NC}"
fi
# 检查OpenSearch
echo -n "OpenSearch: "
OPENSEARCH_STATUS=$(curl -s http://localhost:9200/_cluster/health 2>/dev/null | python3 -c "import sys, json; print(json.load(sys.stdin)['status'])" 2>/dev/null)
if [ "$OPENSEARCH_STATUS" = "green" ] || [ "$OPENSEARCH_STATUS" = "yellow" ]; then
echo -e "${GREEN}✅ $OPENSEARCH_STATUS${NC}"
else
echo -e "${RED}❌ Unhealthy${NC}"
fi
# 检查应用
echo -n "Application: "
APP_STATUS=$(curl -s http://localhost:8845/fiction/actuator/health 2>/dev/null | python3 -c "import sys, json; print(json.load(sys.stdin)['status'])" 2>/dev/null)
if [ "$APP_STATUS" = "UP" ]; then
echo -e "${GREEN}✅ UP${NC}"
else
echo -e "${RED}❌ $APP_STATUS${NC}"
fi
echo ""
echo -e "${BLUE}🌐 访问URL:${NC}"
echo "应用首页: http://localhost:8845/fiction/index"
echo "健康检查: http://localhost:8845/fiction/actuator/health"
echo "Prometheus: http://localhost:8845/fiction/actuator/prometheus"
echo "OpenSearch: http://localhost:9200"
echo "OpenSearch面板: http://localhost:5601"
echo ""
echo -e "${BLUE}📊 数据库连接:${NC}"
echo "MySQL: localhost:23306 (root/123456)"
echo "Redis: localhost:26379 (密码: 123456)"
}
clean_services() {
echo -e "${RED}⚠️ 警告: 这将删除所有容器、网络和卷!${NC}"
read -p "确定要继续吗? (yes/no): " confirm
if [ "$confirm" = "yes" ]; then
echo -e "${YELLOW}🧹 清理所有Docker资源...${NC}"
docker-compose -f $COMPOSE_FILE down -v
echo -e "${GREEN}✅ 清理完成${NC}"
else
echo "已取消"
fi
}
rebuild_services() {
echo -e "${YELLOW}🔨 重新构建并启动服务...${NC}"
# 打包应用
echo "1. 打包应用..."
mvn clean package -DskipTests
# 重启服务
echo "2. 重启Docker服务..."
docker-compose -f $COMPOSE_FILE up -d --force-recreate
echo -e "${GREEN}✅ 重建完成${NC}"
echo ""
show_status
}
enter_shell() {
if [ -z "$1" ]; then
echo -e "${RED}❌ 请指定服务名${NC}"
echo "可用服务: mysql, redis, opensearch, bookstore-app"
exit 1
fi
CONTAINER_NAME="bookstore-$1"
if [ "$1" = "bookstore-app" ]; then
CONTAINER_NAME="bookstore-app"
fi
echo -e "${BLUE}🐚 进入 $CONTAINER_NAME 容器...${NC}"
docker exec -it $CONTAINER_NAME sh || docker exec -it $CONTAINER_NAME bash
}
# 主逻辑
case "$1" in
start)
start_services
;;
stop)
stop_services
;;
restart)
restart_services
;;
status)
show_status
;;
logs)
show_logs $2
;;
health)
check_health
;;
clean)
clean_services
;;
rebuild)
rebuild_services
;;
shell)
enter_shell $2
;;
help|--help|-h)
show_help
;;
*)
if [ -z "$1" ]; then
show_help
else
echo -e "${RED}❌ 未知命令: $1${NC}"
echo ""
show_help
exit 1
fi
;;
esac