123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- #!/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 "$@"
|