这里有我的自定义网络 DockerBridge,你可以绑定默认网络 bridge,至于 IP 你自己设置自己的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
| #!/bin/sh
CONTAINER="dpanel" IMAGE="dpanel/dpanel:lite"
NETWORK="DockerBridge" STATIC_IP="172.20.0.15"
DATA_DIR="/root/Configs/DPanel"
FORCE=0
if [ "$1" = "--force" ]; then FORCE=1 fi
echo "=================================" echo " DPanel 更新脚本" echo "=================================" echo ""
if [ "$FORCE" -eq 1 ]; then echo "[模式] 强制重建模式" else echo "[模式] 普通更新模式" fi
echo ""
if ! command -v docker >/dev/null 2>&1; then echo "[错误] Docker 未安装" exit 1 fi
echo "[1/9] 检查 Docker 网络..."
if ! docker network ls --format '{{.Name}}' | grep -w "$NETWORK" >/dev/null 2>&1; then echo "[错误] Docker 网络不存在: $NETWORK" exit 1 fi
echo "网络正常" echo ""
echo "[2/9] 检查数据目录..."
if [ ! -d "$DATA_DIR" ]; then echo "[错误] 数据目录不存在:" echo "$DATA_DIR" exit 1 fi
echo "数据目录正常" echo ""
echo "[3/9] 获取当前镜像信息..."
OLD_IMAGE_ID=$(docker inspect "$CONTAINER" --format '{{.Image}}' 2>/dev/null)
if [ -z "$OLD_IMAGE_ID" ]; then echo "[错误] 获取当前镜像失败" exit 1 fi
echo "当前镜像ID:" echo "$OLD_IMAGE_ID" echo ""
echo "[4/9] 拉取最新镜像..."
docker pull "$IMAGE"
if [ $? -ne 0 ]; then echo "[错误] 镜像拉取失败" exit 1 fi
NEW_IMAGE_ID=$(docker images --no-trunc --quiet "$IMAGE" | head -n 1)
if [ -z "$NEW_IMAGE_ID" ]; then echo "[错误] 获取最新镜像失败" exit 1 fi
echo "" echo "最新镜像ID:" echo "$NEW_IMAGE_ID" echo ""
if [ "$FORCE" -eq 0 ]; then if [ "$OLD_IMAGE_ID" = "$NEW_IMAGE_ID" ]; then echo "[提示] 当前已经是最新版本" exit 0 fi fi
echo "[5/9] 停止旧容器..."
docker stop "$CONTAINER" >/dev/null 2>&1
echo "旧容器已停止" echo ""
echo "[6/9] 删除旧容器..."
docker rm "$CONTAINER" >/dev/null 2>&1
echo "旧容器已删除" echo ""
echo "[7/9] 创建新容器..."
docker run -d \ --name="$CONTAINER" \ --hostname="$CONTAINER" \ --restart=unless-stopped \ --network="$NETWORK" \ --ip="$STATIC_IP" \ -v "$DATA_DIR:/dpanel" \ -v /mnt:/mnt \ -v /var/run/docker.sock:/var/run/docker.sock \ "$IMAGE"
if [ $? -ne 0 ]; then echo "" echo "[错误] 新容器启动失败" echo "正在尝试回滚..."
docker run -d \ --name="$CONTAINER" \ --hostname="$CONTAINER" \ --restart=unless-stopped \ --network="$NETWORK" \ --ip="$STATIC_IP" \ -v "$DATA_DIR:/dpanel" \ -v /mnt:/mnt \ -v /var/run/docker.sock:/var/run/docker.sock \ "$OLD_IMAGE_ID"
if [ $? -eq 0 ]; then echo "" echo "[回滚成功] 已恢复旧版本" else echo "" echo "[严重错误] 回滚失败" fi
exit 1 fi
echo "" echo "[8/9] 等待容器启动..."
sleep 5
if ! docker ps --format '{{.Names}}' | grep -w "$CONTAINER" >/dev/null 2>&1; then echo "[错误] 容器未成功运行" exit 1 fi
echo "容器运行正常" echo ""
echo "[9/9] 清理无用镜像..."
docker image prune -f >/dev/null 2>&1
echo "" echo "=================================" echo " DPanel 更新完成" echo "=================================" echo ""
docker ps | grep "$CONTAINER"
echo "" echo "DPanel 地址:" echo "http://$STATIC_IP:8080" echo ""
|