From e2e36668651ceca9cb4e7053b69b758f4dab55c5 Mon Sep 17 00:00:00 2001 From: xzx3344521 Date: Tue, 13 Jan 2026 00:48:54 +0800 Subject: [PATCH] =?UTF-8?q?Update=20dock=E5=AE=89=E8=A3=85cf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dock安装cf | 198 +++++++++++++++++------------------------------------ 1 file changed, 64 insertions(+), 134 deletions(-) diff --git a/dock安装cf b/dock安装cf index dfc86d5..51e0252 100644 --- a/dock安装cf +++ b/dock安装cf @@ -1,145 +1,75 @@ -#!/usr/bin/env bash -set -euo pipefail +cat > /root/docker-offline-install.sh <<'EOF' +#!/bin/sh -# =============================== -# 仅使用你指定的 Docker 离线包 -# =============================== -URL_PRIMARY="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/xui/dockde12.zip" -URL_BACKUP="https://freeyx.vps3344.dpdns.org/xui/dockde12.zip" +ZIP_NAME="dockde12.zip" +WORKDIR="/root/docker-offline" +URL1="https://freeyx.vps3344.dpdns.org/xui/dockde12.zip" +URL2="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/xui/dockde12.zip" -WORKDIR="/root/docker_offline_install" -ZIP_FILE="$WORKDIR/dockde12.zip" +echo "===== Docker Debian12 离线安装脚本 =====" +date -log(){ echo -e "\033[32m[✔]\033[0m $*"; } -warn(){ echo -e "\033[33m[!]\033[0m $*"; } -err(){ echo -e "\033[31m[✘]\033[0m $*"; } - -# =============================== -# 基础检查 -# =============================== -[ "$(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 锁长期占用,请稍后再试" +# 1. 基础检查 +echo "[1/7] 检查 dpkg" +command -v dpkg >/dev/null 2>&1 || { + echo "[错误] 系统没有 dpkg,无法使用 DEB 离线安装" 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" +cd "$WORKDIR" || exit 1 -log "下载 Docker 离线包(主线路)" -if ! curl -L -k --retry 3 --connect-timeout 10 -o "$ZIP_FILE" "$URL_PRIMARY"; then - warn "主线路失败,切换备用线路" - curl -L -k --retry 3 --connect-timeout 10 -o "$ZIP_FILE" "$URL_BACKUP" \ - || { err "离线包下载失败"; exit 1; } -fi - -[ -s "$ZIP_FILE" ] || { err "下载的 ZIP 文件为空"; exit 1; } - -# =============================== -# 解压并整理 deb -# =============================== -log "解压离线包" -cd "$WORKDIR" -unzip -oq "$ZIP_FILE" || python3 - </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 +# 2. 获取安装包 +if [ ! -f "$ZIP_NAME" ]; then + echo "[2/7] 下载离线安装包(主地址)" + curl -L --fail "$URL1" -o "$ZIP_NAME" || { + echo "[警告] 主地址失败,使用备用地址" + curl -L --fail "$URL2" -o "$ZIP_NAME" || { + echo "[错误] 离线包下载失败" + exit 1 + } + } else - err "Docker 启动失败" - journalctl -xeu docker.service | tail -n 30 - exit 1 + echo "[2/7] 已存在离线包,跳过下载" fi -# =============================== -# 清理 -# =============================== -rm -rf "$WORKDIR" -log "完成" +# 3. 解压 +echo "[3/7] 解压安装包" +rm -rf debs +mkdir debs +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