Update dock安装cf

This commit is contained in:
2026-01-13 00:48:54 +08:00
committed by GitHub
parent 133da00a8d
commit e2e3666865

View File

@@ -1,145 +1,75 @@
#!/usr/bin/env bash cat > /root/docker-offline-install.sh <<'EOF'
set -euo pipefail #!/bin/sh
# =============================== ZIP_NAME="dockde12.zip"
# 仅使用你指定的 Docker 离线包 WORKDIR="/root/docker-offline"
# =============================== URL1="https://freeyx.vps3344.dpdns.org/xui/dockde12.zip"
URL_PRIMARY="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/xui/dockde12.zip" URL2="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/xui/dockde12.zip"
URL_BACKUP="https://freeyx.vps3344.dpdns.org/xui/dockde12.zip"
WORKDIR="/root/docker_offline_install" echo "===== Docker Debian12 离线安装脚本 ====="
ZIP_FILE="$WORKDIR/dockde12.zip" date
log(){ echo -e "\033[32m[✔]\033[0m $*"; } # 1. 基础检查
warn(){ echo -e "\033[33m[!]\033[0m $*"; } echo "[1/7] 检查 dpkg"
err(){ echo -e "\033[31m[✘]\033[0m $*"; } command -v dpkg >/dev/null 2>&1 || {
echo "[错误] 系统没有 dpkg无法使用 DEB 离线安装"
# ===============================
# 基础检查
# ===============================
[ "$(id -u)" -eq 0 ] || { err "请使用 root 运行"; exit 1; }
[ "$(uname -m)" = "x86_64" ] || { err "仅支持 x86_64 架构"; exit 1; }
# ===============================
# dpkg / apt 锁等待
# ===============================
wait_lock() {
for i in {1..60}; do
if fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || \
fuser /var/lib/dpkg/lock >/dev/null 2>&1 || \
fuser /var/cache/apt/archives/lock >/dev/null 2>&1; then
sleep 2
else
return
fi
done
err "dpkg/apt 锁长期占用,请稍后再试"
exit 1 exit 1
} }
# ===============================
# 环境提示(不强退)
# ===============================
if command -v systemd-detect-virt >/dev/null 2>&1; then
virt=$(systemd-detect-virt || true)
if [ "$virt" != "none" ] && [ -n "$virt" ]; then
warn "检测到虚拟化/容器环境:$virt非特权容器可能无法运行 Docker"
fi
fi
# ===============================
# 准备工具(不涉及 Docker 来源)
# ===============================
wait_lock
apt-get update -y >/dev/null 2>&1 || true
apt-get install -y curl wget unzip python3 >/dev/null 2>&1 || true
# ===============================
# 停服务 + 清理冲突
# ===============================
log "停止旧 Docker / containerd"
systemctl stop docker >/dev/null 2>&1 || true
systemctl stop containerd >/dev/null 2>&1 || true
log "清理可能冲突的旧包"
wait_lock
apt-get remove -y docker.io docker-doc docker-compose podman-docker \
docker-ce docker-ce-cli containerd containerd.io runc >/dev/null 2>&1 || true
apt-get purge -y docker.io docker-doc docker-compose podman-docker \
docker-ce docker-ce-cli containerd containerd.io runc >/dev/null 2>&1 || true
apt-get autoremove -y >/dev/null 2>&1 || true
# containerd 老配置是最大坑,直接备份移走
if [ -f /etc/containerd/config.toml ]; then
warn "发现旧 containerd 配置,已备份并移除"
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak.$(date +%s)
fi
# ===============================
# 下载离线包(双线路)
# ===============================
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR" mkdir -p "$WORKDIR"
cd "$WORKDIR" || exit 1
log "下载 Docker 离线包(主线路)" # 2. 获取安装包
if ! curl -L -k --retry 3 --connect-timeout 10 -o "$ZIP_FILE" "$URL_PRIMARY"; then if [ ! -f "$ZIP_NAME" ]; then
warn "主线路失败,切换备用线路" echo "[2/7] 下载离线安装包(主地址)"
curl -L -k --retry 3 --connect-timeout 10 -o "$ZIP_FILE" "$URL_BACKUP" \ curl -L --fail "$URL1" -o "$ZIP_NAME" || {
|| { err "离线包下载失败"; exit 1; } echo "[警告] 主地址失败,使用备用地址"
fi curl -L --fail "$URL2" -o "$ZIP_NAME" || {
echo "[错误] 离线包下载失败"
[ -s "$ZIP_FILE" ] || { err "下载的 ZIP 文件为空"; exit 1; } exit 1
}
# =============================== }
# 解压并整理 deb
# ===============================
log "解压离线包"
cd "$WORKDIR"
unzip -oq "$ZIP_FILE" || python3 - <<PY
import zipfile
zipfile.ZipFile("$ZIP_FILE").extractall("$WORKDIR")
PY
find "$WORKDIR" -name "*.deb" -exec mv -f {} "$WORKDIR" \; 2>/dev/null
ls *.deb >/dev/null 2>&1 || { err "未找到 deb 文件"; exit 1; }
# ===============================
# 安装(两段式,保证成功率)
# ===============================
log "安装 Docker第一次 dpkg"
set +e
dpkg -i --force-overwrite *.deb >/dev/null 2>&1
set -e
log "修复依赖"
wait_lock
apt-get -f install -y || { err "依赖修复失败"; exit 1; }
log "重新安装 Docker第二次 dpkg"
dpkg -i --force-overwrite *.deb >/dev/null 2>&1 || { err "dpkg 安装失败"; exit 1; }
# ===============================
# 启动并验证
# ===============================
log "启动 Docker"
systemctl daemon-reload >/dev/null 2>&1 || true
systemctl unmask docker >/dev/null 2>&1 || true
systemctl enable docker >/dev/null 2>&1 || true
systemctl restart docker >/dev/null 2>&1 || true
sleep 1
if docker info >/dev/null 2>&1; then
log "Docker 安装成功"
docker --version
docker compose version >/dev/null 2>&1 && docker compose version
else else
err "Docker 启动失败" echo "[2/7] 已存在离线包,跳过下载"
journalctl -xeu docker.service | tail -n 30
exit 1
fi fi
# =============================== # 3. 解压
# 清理 echo "[3/7] 解压安装包"
# =============================== rm -rf debs
rm -rf "$WORKDIR" mkdir debs
log "完成" unzip -o "$ZIP_NAME" -d debs || {
echo "[错误] 解压失败"
exit 1
}
cd debs || exit 1
# 4. 强制安装(忽略依赖)
echo "[4/7] 使用 dpkg 强制安装全部 DEB"
dpkg -i *.deb || echo "[提示] 依赖错误已忽略,继续执行"
# 5. 尝试修复(如果 apt 还能用就赚到)
echo "[5/7] 尝试修复依赖(可失败)"
apt-get -f install -y >/dev/null 2>&1 || echo "[提示] apt 修复失败,已跳过"
# 6. 尝试启动 Docker
echo "[6/7] 尝试启动 Docker"
if command -v systemctl >/dev/null 2>&1; then
systemctl daemon-reexec >/dev/null 2>&1
systemctl enable docker >/dev/null 2>&1
systemctl start docker >/dev/null 2>&1
fi
sleep 2
# 7. 验证
echo "[7/7] 验证 Docker 状态"
if command -v docker >/dev/null 2>&1; then
docker version || echo "[警告] docker 命令存在,但 daemon 未启动"
else
echo "[错误] docker 命令未安装成功"
fi
echo "===== 脚本执行结束 ====="
date
EOF