Update dock安装cf

This commit is contained in:
2026-01-12 15:57:24 +08:00
committed by GitHub
parent fbc064b104
commit 1f759825bc

View File

@@ -1,158 +1,217 @@
cat > /data/install_docker_online.sh << 'EOF' cat > /data/install_docker_offline.sh << 'EOF'
#!/bin/bash #!/usr/bin/env bash
set -euo pipefail
# ================= 配置区域 ================= # 仅使用你提供的离线包Docker 本体来源固定为 ZIP
# 主线路 (Cloudflare R2 - 通常速度快且稳定)
URL_PRIMARY="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/xui/dockde12.zip" URL_PRIMARY="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/xui/dockde12.zip"
# 备用线路 (个人VPS - 兜底用)
URL_BACKUP="https://freeyx.vps3344.dpdns.org/xui/dockde12.zip" URL_BACKUP="https://freeyx.vps3344.dpdns.org/xui/dockde12.zip"
INSTALL_DIR="/data/docker_install_temp" WORKDIR="/tmp/docker_offline_install"
ZIP_FILE="$INSTALL_DIR/dockde12.zip" ZIP_FILE="$WORKDIR/dockde12.zip"
TARGET_VER="29.1.3"
# ===========================================
# 颜色定义 log(){ echo "[*] $*"; }
RED='\033[0;31m' warn(){ echo "[!] $*"; }
GREEN='\033[0;32m' die(){ echo "[X] $*"; exit 1; }
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}====================================================${NC}" need_root() {
echo -e "${BLUE} Docker 全自动在线安装脚本 V4.0 (双线路版) ${NC}" [ "$(id -u)" -eq 0 ] || die "请使用 root 运行sudo -i 后再执行)"
echo -e "${BLUE}====================================================${NC}" }
# 1.【权限与架构检查】 arch_check() {
if [ "$(id -u)" -ne 0 ]; then [ "$(uname -m)" = "x86_64" ] || die "仅支持 x86_64AMD64架构"
echo -e "${RED}❌ 错误: 请使用 root 权限运行!${NC}"; exit 1 }
fi
if [ "$(uname -m)" != "x86_64" ]; then wait_dpkg_locks() {
echo -e "${RED}❌ 错误: 此安装包仅支持 x86_64 (AMD64) 架构。${NC}"; exit 1 log "检查 dpkg/apt 锁..."
fi local i
for i in $(seq 1 60); do
# 2.【彻底清理冲突与残留】 if fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || \
echo -e "${YELLOW}🧹 步骤1/5: 清理旧版本与冲突配置...${NC}" fuser /var/lib/dpkg/lock >/dev/null 2>&1 || \
systemctl stop docker >/dev/null 2>&1 fuser /var/cache/apt/archives/lock >/dev/null 2>&1; then
systemctl stop containerd >/dev/null 2>&1 sleep 2
continue
# 关键:移除可能导致服务启动失败的 containerd 配置文件
if [ -f /etc/containerd/config.toml ]; then
echo " -> 备份并移除旧的 containerd 配置 (防止冲突)..."
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak.$(date +%s)
fi
# 卸载冲突软件
PKGS="docker.io docker-doc docker-compose podman-docker containerd runc docker-ce docker-ce-cli containerd.io"
for pkg in $PKGS; do
if dpkg -l | grep -q "$pkg"; then
apt-get remove -y "$pkg" >/dev/null 2>&1
apt-get purge -y "$pkg" >/dev/null 2>&1
fi fi
return 0
done done
apt-get autoremove -y >/dev/null 2>&1 die "dpkg/apt 锁持续占用(可能正在自动更新)。请稍后再运行。"
}
# 3.【智能下载】(双线路切换) env_sanity_check() {
echo -e "${YELLOW}📥 步骤2/5: 开始下载安装包...${NC}" # systemd 检查:没有 systemd 的环境docker.service 无法按常规启动
rm -rf "$INSTALL_DIR" if ! command -v systemctl >/dev/null 2>&1; then
mkdir -p "$INSTALL_DIR" warn "检测不到 systemctl可能不是标准 Debian 主机环境)。安装可能完成,但无法以 systemd 方式启动。"
else
if ! systemctl is-system-running >/dev/null 2>&1; then
warn "systemd 可能未正常运行(容器/精简环境常见。即使安装成功docker 服务也可能无法启动。"
fi
fi
download_success=0 # 容器环境提示(不强制退出,但给出风险提示)
if command -v systemd-detect-virt >/dev/null 2>&1; then
local virt
virt="$(systemd-detect-virt || true)"
if [ "$virt" != "none" ] && [ -n "$virt" ]; then
warn "检测到虚拟化/容器环境:$virt。若是非特权 LXC/OpenVZDocker 可能无法运行(需要特权/开启 nesting。"
fi
fi
}
# 检查工具 install_tools_if_missing() {
# 仅安装“解压/下载必要工具”,不涉及 Docker 包来源
wait_dpkg_locks
if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then
log "安装下载工具 curl..."
apt-get update -y >/dev/null 2>&1 || true
apt-get install -y curl >/dev/null 2>&1 || die "无法安装 curl网络或源不可用"
fi
if ! command -v unzip >/dev/null 2>&1 && ! command -v python3 >/dev/null 2>&1; then
log "安装解压工具 unzip或 python3..."
apt-get update -y >/dev/null 2>&1 || true
apt-get install -y unzip >/dev/null 2>&1 || true
if ! command -v unzip >/dev/null 2>&1; then
apt-get install -y python3 >/dev/null 2>&1 || die "缺少 unzip/python3 且无法安装(网络或源不可用)"
fi
fi
}
stop_old_services() {
log "停止可能存在的旧服务..."
systemctl stop docker >/dev/null 2>&1 || true
systemctl stop containerd >/dev/null 2>&1 || true
}
purge_conflicts() {
log "清理可能冲突的旧包(尽量保证可重复安装)..."
# 这些包会与离线 docker-ce / containerd.io / runc 冲突
local PKGS="docker.io docker-doc docker-compose podman-docker containerd runc docker-ce docker-ce-cli containerd.io"
wait_dpkg_locks
apt-get remove -y $PKGS >/dev/null 2>&1 || true
apt-get purge -y $PKGS >/dev/null 2>&1 || true
apt-get autoremove -y >/dev/null 2>&1 || true
# 关键:旧 containerd 配置经常导致新版本 containerd 启动失败
if [ -f /etc/containerd/config.toml ]; then
log "备份并移除旧 /etc/containerd/config.toml避免 containerd 启动冲突)"
mv /etc/containerd/config.toml "/etc/containerd/config.toml.bak.$(date +%s)" || true
fi
}
download_zip() {
log "准备下载离线包(双线路)..."
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"
local ok=0
if command -v curl >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
DL_CMD="curl -L -k --retry 3 --connect-timeout 10 -o" curl -L -k --retry 3 --connect-timeout 10 -o "$ZIP_FILE" "$URL_PRIMARY" && ok=1 || true
elif command -v wget >/dev/null 2>&1; then if [ "$ok" -ne 1 ]; then
DL_CMD="wget --no-check-certificate -t 3 -T 10 -O" curl -L -k --retry 3 --connect-timeout 10 -o "$ZIP_FILE" "$URL_BACKUP" && ok=1 || true
fi
else else
echo -e "${RED}❌ 错误: 系统缺少 curl 或 wget无法下载。${NC}" wget --no-check-certificate -t 3 -T 10 -O "$ZIP_FILE" "$URL_PRIMARY" && ok=1 || true
echo "尝试运行: apt-get update && apt-get install curl -y" if [ "$ok" -ne 1 ]; then
exit 1 wget --no-check-certificate -t 3 -T 10 -O "$ZIP_FILE" "$URL_BACKUP" && ok=1 || true
fi
# 尝试线路 1
echo " -> 正在尝试主线路 (R2 Storage)..."
$DL_CMD "$ZIP_FILE" "$URL_PRIMARY"
if [ $? -eq 0 ] && [ -s "$ZIP_FILE" ]; then
echo -e "${GREEN} -> 主线路下载成功!${NC}"
download_success=1
else
echo -e "${RED} -> 主线路下载失败或文件为空,切换备用线路...${NC}"
# 尝试线路 2
echo " -> 正在尝试备用线路 (VPS)..."
$DL_CMD "$ZIP_FILE" "$URL_BACKUP"
if [ $? -eq 0 ] && [ -s "$ZIP_FILE" ]; then
echo -e "${GREEN} -> 备用线路下载成功!${NC}"
download_success=1
fi fi
fi fi
if [ $download_success -eq 0 ]; then [ "$ok" -eq 1 ] || die "离线包下载失败(两条线路都失败)"
echo -e "${RED}❌ 错误: 所有下载线路均失败,请检查网络连接。${NC}"; exit 1 [ -s "$ZIP_FILE" ] || die "离线包下载为空文件"
fi }
# 4.【智能解压】 extract_debs() {
echo -e "${YELLOW}📦 步骤3/5: 解压安装包...${NC}" log "解压离线包..."
cd "$INSTALL_DIR" || exit cd "$WORKDIR"
# 优先用 unzip失败用 python
if command -v unzip >/dev/null 2>&1; then if command -v unzip >/dev/null 2>&1; then
unzip -o "$ZIP_FILE" >/dev/null 2>&1 unzip -oq "$ZIP_FILE" || die "unzip 解压失败"
else else
echo " -> 未找到 unzip使用 Python 解压..." python3 - <<PY
python3 -c "import zipfile; zipfile.ZipFile('$ZIP_FILE', 'r').extractall('.')" import zipfile, sys
try:
zipfile.ZipFile("$ZIP_FILE").extractall("$WORKDIR")
except Exception as e:
print(e)
sys.exit(1)
PY
fi fi
# 整理文件 (防止套娃目录) # 防止套娃目录:把所有 deb 收拢到 WORKDIR 根目录
find . -name "*.deb" -exec mv {} . \; 2>/dev/null find "$WORKDIR" -name "*.deb" -exec mv -f {} "$WORKDIR" \; 2>/dev/null || true
DEB_COUNT=$(ls *.deb 2>/dev/null | wc -l)
if [ "$DEB_COUNT" -eq 0 ]; then ls "$WORKDIR"/*.deb >/dev/null 2>&1 || die "解压后未找到 .deb 文件(可能压缩包结构变化或损坏)"
echo -e "${RED}❌ 错误: 压缩包已下载但未找到 .deb 文件,可能文件已损坏。${NC}"; exit 1 }
install_debs_with_fix() {
log "安装离线 deb 包..."
cd "$WORKDIR"
# 第一次安装可能会失败(依赖缺失),不直接退出
set +e
dpkg -i --force-overwrite ./*.deb >/dev/null 2>&1
local rc=$?
set -e
if [ "$rc" -ne 0 ]; then
warn "dpkg 首次安装遇到依赖/冲突,尝试 apt 自动修复依赖..."
wait_dpkg_locks
apt-get update -y >/dev/null 2>&1 || true
apt-get -f install -y || die "依赖自动修复失败(可能网络/源不可用或系统依赖严重缺失)"
log "依赖修复完成,重试安装 deb..."
dpkg -i --force-overwrite ./*.deb >/dev/null 2>&1 || die "重试 dpkg 安装仍失败"
fi fi
}
# 5.【强力安装】 start_and_verify() {
echo -e "${YELLOW}🚀 步骤4/5: 执行安装...${NC}" log "启动 Docker..."
dpkg -i --force-overwrite *.deb >/dev/null 2>&1 if command -v systemctl >/dev/null 2>&1; then
systemctl daemon-reload >/dev/null 2>&1 || true
if [ $? -ne 0 ]; then systemctl unmask docker >/dev/null 2>&1 || true
echo -e "${RED}⚠ 首次安装依赖不足,正在尝试自动修复...${NC}" systemctl enable docker >/dev/null 2>&1 || true
apt-get update --allow-insecure-repositories >/dev/null 2>&1 systemctl restart docker >/dev/null 2>&1 || true
apt-get install -f -y sleep 1
echo " -> 修复完成,重试安装..."
dpkg -i --force-overwrite *.deb
fi
# 6.【启动与验证】
echo -e "${YELLOW}⚙ 步骤5/5: 配置并启动服务...${NC}"
systemctl daemon-reload
systemctl unmask docker >/dev/null 2>&1
systemctl enable docker
systemctl restart docker
# 检查 Docker 状态
echo "----------------------------------------------------"
FINAL_VER=$(docker --version 2>/dev/null)
if [[ "$FINAL_VER" == *"$TARGET_VER"* ]]; then
echo -e "${GREEN}✅ 安装成功!${NC}"
echo -e " Docker 版本: $FINAL_VER"
echo -e " Compose版本: $(docker compose version 2>/dev/null)"
# 检查进程是否存活
if systemctl is-active --quiet docker; then
echo -e " 服务状态: ${GREEN}运行正常 (Active)${NC}"
else else
echo -e " 服务状态: ${RED}启动失败 (Failed)${NC}" warn "没有 systemctl跳过 docker.service 启动(需要你自行以非 systemd 方式启动)"
echo -e " 建议查看日志: journalctl -xeu docker.service"
fi
else
echo -e "${RED}❌ 安装失败或版本不匹配。${NC}"
fi fi
# 清理临时文件 if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
rm -rf "$INSTALL_DIR" log "Docker 安装并运行成功:$(docker --version 2>/dev/null || true)"
echo -e "${BLUE}====================================================${NC}" if docker compose version >/dev/null 2>&1; then
log "Compose 可用:$(docker compose version 2>/dev/null || true)"
fi
return 0
fi
warn "Docker 未能正常运行。常见原因:容器环境/内核特性缺失/systemd 不可用。"
if command -v systemctl >/dev/null 2>&1; then
warn "可用命令journalctl -xeu docker.service"
systemctl status docker --no-pager >/dev/null 2>&1 || true
fi
exit 1
}
cleanup() {
rm -rf "$WORKDIR" >/dev/null 2>&1 || true
}
main() {
need_root
arch_check
env_sanity_check
install_tools_if_missing
stop_old_services
purge_conflicts
download_zip
extract_debs
install_debs_with_fix
start_and_verify
cleanup
}
main
EOF EOF
# 赋予执行权限并运行 chmod +x /data/install_docker_offline.sh
chmod +x /data/install_docker_online.sh bash /data/install_docker_offline.sh
bash /data/install_docker_online.sh