#!/bin/bash set -e BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 执行拷贝和打包的核心函数 build_image() { local dir_name=$1 local version=$2 local image_name="nanobot-base:${version}" echo "==================================================" echo "准备构建镜像: ${image_name}" echo "==================================================" # 1. 拷贝 Dashboard.Dockerfile echo ">> [1/3] 拷贝 Dashboard.Dockerfile 到根目录 ..." cp "${BASE_DIR}/Dashboard.Dockerfile" "${BASE_DIR}/${dir_name}/" # 2. 拷贝 dashboard.py echo ">> [2/3] 拷贝 dashboard.py 到 channels 目录 ..." if [ -d "${BASE_DIR}/${dir_name}/nanobot/channels" ]; then cp "${BASE_DIR}/dashboard.py" "${BASE_DIR}/${dir_name}/nanobot/channels/" elif [ -d "${BASE_DIR}/${dir_name}/channels" ]; then cp "${BASE_DIR}/dashboard.py" "${BASE_DIR}/${dir_name}/channels/" else # 兜底创建 nanobot/channels/ mkdir -p "${BASE_DIR}/${dir_name}/nanobot/channels/" cp "${BASE_DIR}/dashboard.py" "${BASE_DIR}/${dir_name}/nanobot/channels/" fi # 3. 执行 Docker build echo ">> [3/3] 开始打包 Docker 镜像: ${image_name} ..." cd "${BASE_DIR}/${dir_name}" docker build -f Dashboard.Dockerfile -t "${image_name}" . echo "==================================================" echo "✅ 构建完成: ${image_name}" echo "==================================================" } echo "请选择操作模式:" echo "1) 从 Git 拉取最新代码并打包 (会覆盖已有同名目录)" echo "2) 扫描本地已有的目录并打包" read -p "输入选项 [1/2]: " mode if [ "$mode" = "1" ]; then echo "正在从 https://github.com/HKUDS/nanobot.git 获取最新版本号..." LATEST_TAG=$(git ls-remote --tags https://github.com/HKUDS/nanobot.git | awk -F/ '{print $3}' | grep -v '\^{}$' | sort -V | tail -n1) if [ -z "$LATEST_TAG" ]; then echo "获取远程版本号失败,请检查网络或仓库地址。" exit 1 fi VERSION="${LATEST_TAG}" DIR_NAME="nanobot-base-${VERSION}" if [ -d "${BASE_DIR}/${DIR_NAME}" ]; then echo ">> 清理已有的目录 ${DIR_NAME} ..." rm -rf "${BASE_DIR}/${DIR_NAME}" fi echo ">> 正在克隆 nanobot (版本: ${VERSION}) ..." git clone -b "${VERSION}" https://github.com/HKUDS/nanobot.git "${BASE_DIR}/${DIR_NAME}" build_image "${DIR_NAME}" "${VERSION}" elif [ "$mode" = "2" ]; then echo "正在扫描本地目录..." # 查找 nanobot-base-* 格式的目录 dirs=($(find "${BASE_DIR}" -maxdepth 1 -type d -name "nanobot-base-*" | awk -F/ '{print $NF}')) if [ ${#dirs[@]} -eq 0 ]; then echo "未找到任何本地克隆的目录 (格式: nanobot-base-*)。" exit 1 fi echo "找到以下本地目录,请选择要打包的目录:" select DIR_NAME in "${dirs[@]}"; do if [ -n "$DIR_NAME" ]; then echo "您选择了: $DIR_NAME" # 提取版本号,例如从 nanobot-base-v0.1.5 提取 v0.1.5 VERSION=${DIR_NAME#nanobot-base-} build_image "${DIR_NAME}" "${VERSION}" break else echo "无效的选项,请重新选择。" fi done else echo "无效的选项,退出。" exit 1 fi