diff --git a/deploy.sh b/deploy.sh index cbf1f6b..7144506 100644 --- a/deploy.sh +++ b/deploy.sh @@ -633,6 +633,7 @@ do_deploy() { print_warn "数据库为空或不可用,请通过 WebUI 注册管理员账户" fi + # ----- 验证版本写入 ----- # ----- 验证版本写入 ----- print_step "验证版本..." sleep 1 @@ -651,6 +652,37 @@ do_deploy() { echo " 如需回退,请恢复: cp -r $BACKUP_DIR/frpc-console/* $DEPLOY_DIR/" fi + # ----- 事务后钩子:清理旧镜像 ----- + print_step "清理旧镜像..." + + # 保留最近 3 个镜像(包括刚构建的) + KEEP_COUNT=3 + + CURRENT_IMAGE_ID=$(docker images -q "${IMAGE_NAME}:${IMAGE_TAG}" 2>/dev/null) + if [ -n "$CURRENT_IMAGE_ID" ]; then + ALL_IMAGES=$(docker images "${IMAGE_NAME}:*" --format "{{.ID}} {{.CreatedAt}}" 2>/dev/null | sort -k2 -r | awk '{print $1}') + COUNTER=0 + TO_DELETE="" + for IMG_ID in $ALL_IMAGES; do + if [ "$IMG_ID" = "$CURRENT_IMAGE_ID" ]; then + continue + fi + COUNTER=$((COUNTER + 1)) + if [ $COUNTER -le $KEEP_COUNT ]; then + continue + fi + TO_DELETE="$TO_DELETE $IMG_ID" + done + if [ -n "$TO_DELETE" ]; then + docker rmi -f $TO_DELETE 2>/dev/null || true + print_info "已清理旧镜像" + else + print_info "无需清理,镜像数量未超过保留策略" + fi + else + print_warn "无法获取当前镜像 ID,跳过清理" + fi + # ----- 清理临时文件 ----- print_step "清理临时文件..." rm -rf "$WORK_DIR"