Files
Linux_Docker_build_DayzServer/install.sh
2025-07-22 17:58:34 +08:00

276 lines
8.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"