317 lines
9.5 KiB
Bash
317 lines
9.5 KiB
Bash
#!/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 jq
|
||
else
|
||
yum update -y
|
||
yum install -y curl wget jq
|
||
fi
|
||
else
|
||
print_message "使用通用方式安装curl和wget..."
|
||
# 尝试通用方式安装
|
||
if command -v apt &> /dev/null; then
|
||
apt update && apt install -y curl wget jq
|
||
elif command -v dnf &> /dev/null; then
|
||
dnf install -y curl wget jq
|
||
elif command -v yum &> /dev/null; then
|
||
yum install -y curl wget jq
|
||
elif command -v zypper &> /dev/null; then
|
||
zypper install -y curl wget jq
|
||
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
|
||
}
|
||
|
||
# 写入JSON配置文件的函数(更安全)
|
||
write_json_config() {
|
||
local file_path="$1"
|
||
local json_content="$2"
|
||
|
||
mkdir -p "$(dirname "$file_path")"
|
||
|
||
if command -v jq &> /dev/null; then
|
||
if echo "$json_content" | jq . > /dev/null 2>&1; then
|
||
print_message "JSON格式验证通过"
|
||
else
|
||
print_error "JSON格式无效"
|
||
return 1
|
||
fi
|
||
fi
|
||
|
||
echo "$json_content" | tee "$file_path" > /dev/null
|
||
|
||
if [ $? -eq 0 ]; then
|
||
print_message "成功写入JSON配置文件: $file_path"
|
||
else
|
||
print_error "写入JSON配置文件失败: $file_path"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 验证安装
|
||
verify_installation() {
|
||
# 修改国内的docker源
|
||
local docker_daemon_config='{
|
||
"registry-mirrors": [
|
||
"https://docker.1panel.live",
|
||
"https://docker.1ms.run",
|
||
"https://docker.m.daocloud.io",
|
||
"https://registry.cn-hangzhou.aliyuncs.com"
|
||
]
|
||
}'
|
||
|
||
write_json_config "/etc/docker/daemon.json" "$docker_daemon_config"
|
||
|
||
systemctl daemon-reload
|
||
systemctl restart docker
|
||
|
||
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 "$@" |