diff --git a/.github/workflows/scripts/docker-services.sh b/.github/workflows/scripts/docker-services.sh index 66a10526289..1ffbe13c20e 100755 --- a/.github/workflows/scripts/docker-services.sh +++ b/.github/workflows/scripts/docker-services.sh @@ -1,15 +1,15 @@ -#!/bin/bash +#!/usr/bin/env bash # # GoFrame Docker Services Manager -# 用于本地开发时管理测试用的Docker服务 +# For managing Docker services used in local development and testing # set -e -# 容器名前缀 +# Container name prefix PREFIX="goframe" -# 颜色定义 +# Color definitions RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' @@ -17,13 +17,13 @@ BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color -# 服务定义 +# Service definitions declare -A SERVICES declare -A SERVICE_PORTS declare -A SERVICE_ENVS declare -A SERVICE_OPTS -# 基础服务 +# Basic services SERVICES["etcd"]="bitnamilegacy/etcd:3.4.24" SERVICE_PORTS["etcd"]="2379:2379" SERVICE_ENVS["etcd"]="-e ALLOW_NONE_AUTHENTICATION=yes" @@ -70,18 +70,18 @@ SERVICE_OPTS["gaussdb"]="--privileged=true" SERVICES["zookeeper"]="zookeeper:3.8" SERVICE_PORTS["zookeeper"]="2181:2181" -# 服务分组 +# Service groups GROUP_DB="mysql mariadb postgres mssql oracle dm gaussdb clickhouse" GROUP_CACHE="redis etcd" GROUP_REGISTRY="polaris zookeeper" GROUP_ALL="etcd redis mysql mariadb postgres mssql clickhouse polaris oracle dm gaussdb zookeeper" -# 工作目录 +# Working directories SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" WORKFLOW_DIR="$PROJECT_ROOT/.github/workflows" -# 打印带颜色的消息 +# Print colored messages print_info() { echo -e "${BLUE}[INFO]${NC} $1" } @@ -98,24 +98,24 @@ print_error() { echo -e "${RED}[ERROR]${NC} $1" } -# 检查Docker是否可用 +# Check if Docker is available check_docker() { if ! command -v docker &> /dev/null; then - print_error "Docker 未安装或不在PATH中" + print_error "Docker is not installed or not in PATH" exit 1 fi if ! docker info &> /dev/null; then - print_error "Docker 服务未运行" + print_error "Docker service is not running" exit 1 fi } -# 获取容器名 +# Get container name get_container_name() { echo "${PREFIX}-$1" } -# 启动单个服务 +# Start a single service start_service() { local service=$1 local container_name=$(get_container_name "$service") @@ -125,39 +125,39 @@ start_service() { local opts="${SERVICE_OPTS[$service]}" if [ -z "$image" ]; then - print_error "未知服务: $service" + print_error "Unknown service: $service" return 1 fi - # 检查容器是否已存在 + # Check if container already exists if docker ps -a --format '{{.Names}}' | grep -q "^${container_name}$"; then if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then - print_warning "$service 已在运行" + print_warning "$service is already running" return 0 else - print_info "启动已存在的容器 $service..." + print_info "Starting existing container $service..." docker start "$container_name" > /dev/null - print_success "$service 已启动" + print_success "$service started" return 0 fi fi - print_info "启动 $service..." + print_info "Starting $service..." - # 构建docker run命令 + # Build docker run command local cmd="docker run -d --name $container_name" - # 添加端口映射 + # Add port mappings for port in $ports; do cmd="$cmd -p $port" done - # 添加环境变量 + # Add environment variables if [ -n "$envs" ]; then cmd="$cmd $envs" fi - # 添加其他选项 + # Add other options if [ -n "$opts" ]; then cmd="$cmd $opts" fi @@ -165,42 +165,42 @@ start_service() { cmd="$cmd $image" if eval "$cmd" > /dev/null 2>&1; then - print_success "$service 已启动 (容器: $container_name)" + print_success "$service started (container: $container_name)" else - print_error "$service 启动失败" + print_error "Failed to start $service" return 1 fi } -# 停止单个服务 +# Stop a single service stop_service() { local service=$1 local container_name=$(get_container_name "$service") if docker ps --format '{{.Names}}' | grep -q "^${container_name}$"; then - print_info "停止 $service..." + print_info "Stopping $service..." docker stop "$container_name" > /dev/null - print_success "$service 已停止" + print_success "$service stopped" else - print_warning "$service 未在运行" + print_warning "$service is not running" fi } -# 删除单个服务 +# Remove a single service remove_service() { local service=$1 local container_name=$(get_container_name "$service") if docker ps -a --format '{{.Names}}' | grep -q "^${container_name}$"; then - print_info "删除 $service..." + print_info "Removing $service..." docker rm -f "$container_name" > /dev/null - print_success "$service 已删除" + print_success "$service removed" else - print_warning "$service 容器不存在" + print_warning "$service container does not exist" fi } -# 查看服务日志 +# View service logs logs_service() { local service=$1 local container_name=$(get_container_name "$service") @@ -209,12 +209,12 @@ logs_service() { if docker ps -a --format '{{.Names}}' | grep -q "^${container_name}$"; then docker logs --tail "$lines" -f "$container_name" else - print_error "$service 容器不存在" + print_error "$service container does not exist" return 1 fi } -# 启动docker-compose服务 +# Start docker-compose service start_compose_service() { local service=$1 local compose_file="" @@ -233,22 +233,22 @@ start_compose_service() { compose_file="$WORKFLOW_DIR/consul/docker-compose.yml" ;; *) - print_error "未知compose服务: $service" + print_error "Unknown compose service: $service" return 1 ;; esac if [ -f "$compose_file" ]; then - print_info "启动 $service (docker-compose)..." + print_info "Starting $service (docker-compose)..." docker compose -f "$compose_file" up -d - print_success "$service 已启动" + print_success "$service started" else - print_error "compose文件不存在: $compose_file" + print_error "Compose file does not exist: $compose_file" return 1 fi } -# 停止docker-compose服务 +# Stop docker-compose service stop_compose_service() { local service=$1 local compose_file="" @@ -267,22 +267,22 @@ stop_compose_service() { compose_file="$WORKFLOW_DIR/consul/docker-compose.yml" ;; *) - print_error "未知compose服务: $service" + print_error "Unknown compose service: $service" return 1 ;; esac if [ -f "$compose_file" ]; then - print_info "停止 $service (docker-compose)..." + print_info "Stopping $service (docker-compose)..." docker compose -f "$compose_file" down - print_success "$service 已停止" + print_success "$service stopped" else - print_error "compose文件不存在: $compose_file" + print_error "Compose file does not exist: $compose_file" return 1 fi } -# 显示服务状态 +# Show service status show_status() { echo "" echo -e "${CYAN}========== GoFrame Docker Services Status ==========${NC}" @@ -338,12 +338,12 @@ show_status() { echo "" } -# 显示服务信息 +# Show service information show_service_info() { echo "" echo -e "${CYAN}========== Available Services ==========${NC}" echo "" - echo -e "${YELLOW}基础服务 (独立容器):${NC}" + echo -e "${YELLOW}Basic Services (standalone containers):${NC}" echo "" printf "%-15s %-50s %s\n" "SERVICE" "IMAGE" "PORTS" echo "--------------------------------------------------------------------------------" @@ -353,61 +353,61 @@ show_service_info() { done echo "" - echo -e "${YELLOW}Compose服务 (多容器):${NC}" - echo " apollo - Apollo配置中心 (8080, 8070, 8060, 13306)" - echo " nacos - Nacos注册中心 (8848, 9848, 9555)" - echo " redis-cluster - Redis主从+哨兵集群 (6380-6382, 26379-26381)" - echo " consul - Consul服务发现 (8500, 8600)" + echo -e "${YELLOW}Compose Services (multi-container):${NC}" + echo " apollo - Apollo Config Center (8080, 8070, 8060, 13306)" + echo " nacos - Nacos Registry (8848, 9848, 9555)" + echo " redis-cluster - Redis Primary-Replica + Sentinel Cluster (6380-6382, 26379-26381)" + echo " consul - Consul Service Discovery (8500, 8600)" echo "" - echo -e "${YELLOW}服务分组:${NC}" - echo " db - 数据库: $GROUP_DB" - echo " cache - 缓存: $GROUP_CACHE" - echo " registry - 注册中心: $GROUP_REGISTRY" - echo " all - 所有基础服务" + echo -e "${YELLOW}Service Groups:${NC}" + echo " db - Databases: $GROUP_DB" + echo " cache - Cache: $GROUP_CACHE" + echo " registry - Registry: $GROUP_REGISTRY" + echo " all - All basic services" echo "" } -# 显示帮助 +# Show help show_help() { echo "" echo -e "${CYAN}GoFrame Docker Services Manager${NC}" echo "" - echo "用法: $0 [service|group] [options]" + echo "Usage: $0 [service|group] [options]" echo "" - echo "命令:" - echo " start 启动服务或服务组" - echo " stop 停止服务或服务组" - echo " restart 重启服务或服务组" - echo " remove 删除服务容器" - echo " logs [lines] 查看服务日志 (默认100行)" - echo " status 显示所有服务状态" - echo " info 显示可用服务信息" - echo " clean 删除所有goframe容器" - echo " pull [service] 拉取镜像" + echo "Commands:" + echo " start Start service or service group" + echo " stop Stop service or service group" + echo " restart Restart service or service group" + echo " remove Remove service container" + echo " logs [lines] View service logs (default 100 lines)" + echo " status Show all service status" + echo " info Show available service information" + echo " clean Remove all goframe containers" + echo " pull [service] Pull images" echo "" - echo "服务:" - echo " 基础服务: etcd, redis, mysql, mariadb, postgres, mssql," - echo " clickhouse, polaris, oracle, dm, gaussdb, zookeeper" + echo "Services:" + echo " Basic: etcd, redis, mysql, mariadb, postgres, mssql," + echo " clickhouse, polaris, oracle, dm, gaussdb, zookeeper" echo " Compose: apollo, nacos, redis-cluster, consul" echo "" - echo "服务组:" - echo " db - 所有数据库服务" - echo " cache - 缓存服务 (redis, etcd)" - echo " registry - 注册中心 (polaris, zookeeper)" - echo " all - 所有基础服务" + echo "Service Groups:" + echo " db - All database services" + echo " cache - Cache services (redis, etcd)" + echo " registry - Registry services (polaris, zookeeper)" + echo " all - All basic services" echo "" - echo "示例:" - echo " $0 start mysql # 启动MySQL" - echo " $0 start db # 启动所有数据库" - echo " $0 start all # 启动所有基础服务" - echo " $0 start apollo # 启动Apollo (compose)" - echo " $0 stop all # 停止所有基础服务" - echo " $0 logs mysql 50 # 查看MySQL最近50行日志" - echo " $0 status # 查看服务状态" + echo "Examples:" + echo " $0 start mysql # Start MySQL" + echo " $0 start db # Start all databases" + echo " $0 start all # Start all basic services" + echo " $0 start apollo # Start Apollo (compose)" + echo " $0 stop all # Stop all basic services" + echo " $0 logs mysql 50 # View last 50 lines of MySQL logs" + echo " $0 status # View service status" echo "" } -# 解析服务组 +# Parse service groups parse_services() { local input=$1 case $input in @@ -429,7 +429,7 @@ parse_services() { esac } -# 判断是否为compose服务 +# Check if it's a compose service is_compose_service() { local service=$1 case $service in @@ -442,7 +442,7 @@ is_compose_service() { esac } -# 拉取镜像 +# Pull images pull_images() { local services=$1 @@ -452,28 +452,28 @@ pull_images() { for service in $services; do if [ -n "${SERVICES[$service]}" ]; then - print_info "拉取镜像: ${SERVICES[$service]}" + print_info "Pulling image: ${SERVICES[$service]}" docker pull "${SERVICES[$service]}" fi done } -# 清理所有goframe容器 +# Clean all goframe containers clean_all() { - print_info "删除所有 $PREFIX 容器..." + print_info "Removing all $PREFIX containers..." local containers=$(docker ps -a --filter "name=$PREFIX" --format '{{.Names}}') if [ -n "$containers" ]; then for container in $containers; do docker rm -f "$container" > /dev/null - print_success "已删除: $container" + print_success "Removed: $container" done else - print_info "没有找到 $PREFIX 容器" + print_info "No $PREFIX containers found" fi } -# 获取服务状态标记 +# Get service status mark get_service_status_mark() { local service=$1 local container_name=$(get_container_name "$service") @@ -485,7 +485,7 @@ get_service_status_mark() { fi } -# 获取compose服务状态标记 +# Get compose service status mark get_compose_status_mark() { local service=$1 local running=0 @@ -512,20 +512,20 @@ get_compose_status_mark() { fi } -# 服务选择菜单 +# Service selection menu select_service_menu() { local action=$1 local action_name=$2 echo "" - echo -e "${CYAN}========== 选择${action_name}的服务 ==========${NC}" + echo -e "${CYAN}========== Select Service to ${action_name} ==========${NC}" - # 停止/重启/日志操作时显示运行状态 + # Show running status for stop/restart/logs operations if [[ "$action" == "stop" || "$action" == "restart" || "$action" == "logs" ]]; then - echo -e " (${GREEN}*${NC} 表示正在运行)" + echo -e " (${GREEN}*${NC} indicates running)" fi echo "" - echo -e "${YELLOW}基础服务:${NC}" + echo -e "${YELLOW}Basic Services:${NC}" printf " %b1) etcd %b2) redis %b3) mysql\n" \ "$(get_service_status_mark etcd)" "$(get_service_status_mark redis)" "$(get_service_status_mark mysql)" printf " %b4) mariadb %b5) postgres %b6) mssql\n" \ @@ -535,18 +535,18 @@ select_service_menu() { printf " %b10) dm %b11) gaussdb %b12) zookeeper\n" \ "$(get_service_status_mark dm)" "$(get_service_status_mark gaussdb)" "$(get_service_status_mark zookeeper)" echo "" - echo -e "${YELLOW}Compose服务:${NC}" + echo -e "${YELLOW}Compose Services:${NC}" printf " %b13) apollo %b14) nacos %b15) redis-cluster\n" \ "$(get_compose_status_mark apollo)" "$(get_compose_status_mark nacos)" "$(get_compose_status_mark redis-cluster)" printf " %b16) consul\n" "$(get_compose_status_mark consul)" echo "" - echo -e "${YELLOW}服务组:${NC}" - echo " 17) db (所有数据库) 18) cache (缓存服务)" - echo " 19) registry (注册中心) 20) all (所有基础服务)" + echo -e "${YELLOW}Service Groups:${NC}" + echo " 17) db (all databases) 18) cache (cache services)" + echo " 19) registry (registry services) 20) all (all basic services)" echo "" - echo " 0) 返回上级菜单" + echo " 0) Back to main menu" echo "" - read -p "请选择 [0-20]: " svc_choice + read -p "Select [0-20]: " svc_choice local svc="" case $svc_choice in @@ -572,7 +572,7 @@ select_service_menu() { 20) svc="all" ;; 0) return ;; *) - print_error "无效选择" + print_error "Invalid selection" return ;; esac @@ -614,9 +614,9 @@ select_service_menu() { ;; logs) if is_compose_service "$svc"; then - print_error "Compose服务请使用 docker compose logs 查看" + print_error "For Compose services, please use 'docker compose logs'" else - read -p "显示行数 (默认100): " lines + read -p "Number of lines (default 100): " lines lines=${lines:-100} logs_service "$svc" "$lines" fi @@ -627,40 +627,40 @@ select_service_menu() { esac } -# 交互式菜单 +# Interactive menu interactive_menu() { while true; do echo "" echo -e "${CYAN}========== GoFrame Docker Services Manager ==========${NC}" echo "" - echo " 1) 启动服务" - echo " 2) 停止服务" - echo " 3) 重启服务" - echo " 4) 删除服务" - echo " 5) 查看日志" - echo " 6) 查看状态" - echo " 7) 服务信息" - echo " 8) 清理所有容器" - echo " 9) 拉取镜像" - echo " 0) 退出" + echo " 1) Start Service" + echo " 2) Stop Service" + echo " 3) Restart Service" + echo " 4) Remove Service" + echo " 5) View Logs" + echo " 6) View Status" + echo " 7) Service Info" + echo " 8) Clean All Containers" + echo " 9) Pull Images" + echo " 0) Exit" echo "" - read -p "请选择操作 [0-9]: " choice + read -p "Select operation [0-9]: " choice case $choice in 1) - select_service_menu "start" "启动" + select_service_menu "start" "Start" ;; 2) - select_service_menu "stop" "停止" + select_service_menu "stop" "Stop" ;; 3) - select_service_menu "restart" "重启" + select_service_menu "restart" "Restart" ;; 4) - select_service_menu "remove" "删除" + select_service_menu "remove" "Remove" ;; 5) - select_service_menu "logs" "查看日志" + select_service_menu "logs" "View Logs" ;; 6) show_status @@ -669,26 +669,26 @@ interactive_menu() { show_service_info ;; 8) - read -p "确认删除所有goframe容器? [y/N]: " confirm + read -p "Confirm removing all goframe containers? [y/N]: " confirm if [[ "$confirm" =~ ^[Yy]$ ]]; then clean_all fi ;; 9) - select_service_menu "pull" "拉取镜像" + select_service_menu "pull" "Pull Images" ;; 0) - echo "再见!" + echo "Goodbye!" exit 0 ;; *) - print_error "无效选择" + print_error "Invalid selection" ;; esac done } -# 主函数 +# Main function main() { check_docker @@ -704,7 +704,7 @@ main() { case $command in start) if [ -z "$target" ]; then - print_error "请指定服务名或服务组" + print_error "Please specify service name or service group" exit 1 fi if is_compose_service "$target"; then @@ -717,7 +717,7 @@ main() { ;; stop) if [ -z "$target" ]; then - print_error "请指定服务名或服务组" + print_error "Please specify service name or service group" exit 1 fi if is_compose_service "$target"; then @@ -730,7 +730,7 @@ main() { ;; restart) if [ -z "$target" ]; then - print_error "请指定服务名或服务组" + print_error "Please specify service name or service group" exit 1 fi if is_compose_service "$target"; then @@ -745,7 +745,7 @@ main() { ;; remove|rm) if [ -z "$target" ]; then - print_error "请指定服务名或服务组" + print_error "Please specify service name or service group" exit 1 fi for service in $(parse_services "$target"); do @@ -754,7 +754,7 @@ main() { ;; logs) if [ -z "$target" ]; then - print_error "请指定服务名" + print_error "Please specify service name" exit 1 fi logs_service "$target" "${extra:-100}" @@ -775,7 +775,7 @@ main() { show_help ;; *) - print_error "未知命令: $command" + print_error "Unknown command: $command" show_help exit 1 ;;