#!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 打印带颜色的消息 print_message() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检测操作系统类型 detect_os() { if [ -f /etc/os-release ]; then . /etc/os-release OS=$NAME VER=$VERSION_ID elif type lsb_release >/dev/null 2>&1; then OS=$(lsb_release -si) VER=$(lsb_release -sr) elif [ -f /etc/lsb-release ]; then . /etc/lsb-release OS=$DISTRIB_ID VER=$DISTRIB_RELEASE elif [ -f /etc/debian_version ]; then OS=Debian VER=$(cat /etc/debian_version) elif [ -f /etc/SuSe-release ]; then OS=SuSE elif [ -f /etc/redhat-release ]; then OS=RedHat VER=$(cat /etc/redhat-release | sed 's/.*release \([0-9.]*\).*/\1/') else OS=$(uname -s) VER=$(uname -r) fi echo "检测到操作系统: $OS $VER" } # 更新包管理器 update_package_manager() { print_message "更新包管理器..." if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then apt update && apt upgrade -y apt install -y curl wget elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]] || [[ "$OS" == *"Rocky"* ]] || [[ "$OS" == *"AlmaLinux"* ]]; then if command -v dnf &> /dev/null; then dnf update -y dnf install -y curl wget else yum update -y yum install -y curl wget fi else print_message "使用通用方式安装curl和wget..." # 尝试通用方式安装 if command -v apt &> /dev/null; then apt update && apt install -y curl wget elif command -v dnf &> /dev/null; then dnf install -y curl wget elif command -v yum &> /dev/null; then yum install -y curl wget elif command -v zypper &> /dev/null; then zypper install -y curl wget else print_warning "无法自动安装curl和wget,请手动安装" fi fi } # 卸载旧版本Docker remove_old_docker() { print_message "检查并卸载旧版本Docker..." if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]] || [[ "$OS" == *"Rocky"* ]] || [[ "$OS" == *"AlmaLinux"* ]]; then if command -v dnf &> /dev/null; then dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true else yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true fi else print_message "使用通用方式卸载旧版本Docker..." # 通用卸载方式 if command -v apt &> /dev/null; then apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true elif command -v dnf &> /dev/null; then dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true elif command -v yum &> /dev/null; then yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true fi fi } # 安装Docker install_docker() { print_message "安装Docker..." # 使用官方的get-docker.sh脚本,它已经做了跨平台兼容 curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh rm -f get-docker.sh # 启动并启用Docker服务 systemctl start docker systemctl enable docker } # 安装Docker Compose install_docker_compose() { print_message "安装Docker Compose..." # 检查是否已经安装了docker-compose-plugin if docker compose version &> /dev/null; then print_message "Docker Compose 插件已安装" return fi # 下载并安装独立版本的Docker Compose COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4) # 下载适合当前系统的Docker Compose二进制文件 curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 创建软链接 ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose } # 验证安装 verify_installation() { print_message "验证安装..." if command -v docker &> /dev/null; then print_message "Docker 安装成功" docker --version else print_error "Docker 安装失败" exit 1 fi if command -v docker-compose &> /dev/null || docker compose version &> /dev/null; then print_message "Docker Compose 安装成功" if command -v docker-compose &> /dev/null; then docker-compose --version else docker compose version fi else print_error "Docker Compose 安装失败" exit 1 fi # 测试Docker服务 if systemctl is-active --quiet docker; then print_message "Docker 服务运行正常" else print_error "Docker 服务未运行" exit 1 fi } # 构建和启动Docker容器 build_and_start_containers() { print_message "开始构建和启动Docker容器..." # 检查是否存在docker-compose.yml文件 if [ ! -f "docker-compose.yml" ]; then print_error "未找到docker-compose.yml文件,请确保在正确的目录中运行此脚本" exit 1 fi # 构建Docker镜像(不使用缓存) print_message "构建Docker镜像(不使用缓存)..." if command -v docker-compose &> /dev/null; then docker-compose build --no-cache else docker compose build --no-cache fi if [ $? -ne 0 ]; then print_error "Docker镜像构建失败" exit 1 fi print_message "Docker镜像构建成功" # 运行steamcmd容器 print_message "运行steamcmd容器..." if command -v docker-compose &> /dev/null; then docker-compose run --rm steamcmd else docker compose run --rm steamcmd fi if [ $? -ne 0 ]; then print_warning "steamcmd容器运行失败,但继续启动其他服务" else print_message "steamcmd容器运行完成" fi # 启动所有容器 print_message "启动所有Docker容器..." if command -v docker-compose &> /dev/null; then docker-compose up -d else docker compose up -d fi if [ $? -eq 0 ]; then print_message "所有Docker容器启动成功" # 显示容器状态 print_message "容器状态:" if command -v docker-compose &> /dev/null; then docker-compose ps else docker compose ps fi else print_error "Docker容器启动失败" exit 1 fi } # 主函数 main() { print_message "开始安装 Docker 和 Docker Compose..." # 检查是否为root用户 if [[ $EUID -ne 0 ]]; then print_error "此脚本需要root权限运行" exit 1 fi detect_os update_package_manager remove_old_docker install_docker install_docker_compose verify_installation print_message "Docker 和 Docker Compose 安装完成!" # 询问是否继续构建和启动容器 echo read -p "是否现在构建和启动Docker容器?(y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then build_and_start_containers print_message "所有操作完成!" else print_message "安装完成!您可以稍后手动运行以下命令:" print_message "1. docker-compose build --no-cache" print_message "2. docker-compose run --rm steamcmd" print_message "3. docker-compose up -d" print_message "运行第二步时,第一次运行会等待steam验证码,需要手动输入" fi } # 执行主函数 main "$@"