fix(build): reuse multi-tenant ComfyUI image instead of rebuilding every run
- skip docker build when boosapi-comfyui:multi-tenant already exists; --rebuild-image opts back into a fresh build - fall back to `docker load` from docker/boosapi-comfyui-multi-tenant-*.tar when the image is absent but the saved tar is present - gate the whole block on `docker info` so a client-only host doesn't hang on build when the daemon is unreachable
This commit is contained in:
@@ -12,6 +12,7 @@ RELEASE=0
|
|||||||
FRONTEND_ONLY=0
|
FRONTEND_ONLY=0
|
||||||
BACKEND_ONLY=0
|
BACKEND_ONLY=0
|
||||||
NO_RUN=0
|
NO_RUN=0
|
||||||
|
REBUILD_IMAGE=0
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
@@ -22,6 +23,7 @@ usage() {
|
|||||||
--frontend-only 只构建前端
|
--frontend-only 只构建前端
|
||||||
--backend-only 只构建后端
|
--backend-only 只构建后端
|
||||||
--no-run 构建后不启动服务
|
--no-run 构建后不启动服务
|
||||||
|
--rebuild-image 强制重新构建多租户 ComfyUI 镜像(默认:已存在则跳过)
|
||||||
-h, --help 显示帮助
|
-h, --help 显示帮助
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
@@ -32,6 +34,7 @@ while [ $# -gt 0 ]; do
|
|||||||
--frontend-only) FRONTEND_ONLY=1 ;;
|
--frontend-only) FRONTEND_ONLY=1 ;;
|
||||||
--backend-only) BACKEND_ONLY=1 ;;
|
--backend-only) BACKEND_ONLY=1 ;;
|
||||||
--no-run) NO_RUN=1 ;;
|
--no-run) NO_RUN=1 ;;
|
||||||
|
--rebuild-image) REBUILD_IMAGE=1 ;;
|
||||||
-h|--help) usage; exit 0 ;;
|
-h|--help) usage; exit 0 ;;
|
||||||
*) echo "未知参数: $1" >&2; usage >&2; exit 1 ;;
|
*) echo "未知参数: $1" >&2; usage >&2; exit 1 ;;
|
||||||
esac
|
esac
|
||||||
@@ -44,6 +47,25 @@ log() { echo "[$(date '+%H:%M:%S')] $*"; }
|
|||||||
ok() { echo "[$(date '+%H:%M:%S')] ✓ $*"; }
|
ok() { echo "[$(date '+%H:%M:%S')] ✓ $*"; }
|
||||||
fail() { echo "[$(date '+%H:%M:%S')] ✗ $*" >&2; exit 1; }
|
fail() { echo "[$(date '+%H:%M:%S')] ✗ $*" >&2; exit 1; }
|
||||||
|
|
||||||
|
# ── 同步 ComfyUI 子模块 + 应用本地补丁 ─────────────────────────────────────────
|
||||||
|
# comfy_source/ 是 vanilla ComfyUI 的 git 子模块,本地补丁存放在
|
||||||
|
# comfy_patches/overlay/,由 comfy_patches/apply.sh 覆盖到子模块上。
|
||||||
|
# Dockerfile 把整个 comfy_source/ 复制进镜像,所以这一步必须在 docker
|
||||||
|
# build 之前完成,否则镜像里只会有 vanilla 代码。
|
||||||
|
|
||||||
|
if [ -f "$ROOT_DIR/.gitmodules" ] && [ -d "$ROOT_DIR/.git" ]; then
|
||||||
|
if [ ! -f "$ROOT_DIR/comfy_source/main.py" ]; then
|
||||||
|
log "初始化 ComfyUI 子模块..."
|
||||||
|
git submodule update --init --recursive
|
||||||
|
ok "子模块已初始化"
|
||||||
|
fi
|
||||||
|
if [ -d "$ROOT_DIR/comfy_patches/overlay" ]; then
|
||||||
|
log "应用 ComfyUI 本地补丁 (comfy_patches/overlay → comfy_source/)..."
|
||||||
|
"$ROOT_DIR/comfy_patches/apply.sh"
|
||||||
|
ok "本地补丁已应用"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# ── 构建前端 ──────────────────────────────────────────────────────────────────
|
# ── 构建前端 ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
if [ "$BACKEND_ONLY" -eq 0 ]; then
|
if [ "$BACKEND_ONLY" -eq 0 ]; then
|
||||||
@@ -63,6 +85,12 @@ if [ "$FRONTEND_ONLY" -eq 0 ]; then
|
|||||||
fail "未找到 cargo,请先安装 Rust 工具链"
|
fail "未找到 cargo,请先安装 Rust 工具链"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# 提示一次:如果链接器走默认 ld 而 mold 不在 PATH,给出一条性能建议。
|
||||||
|
# mold 安装后还需在 .cargo/config.toml 取消 `linker = "clang"` 那段注释。
|
||||||
|
if ! command -v mold >/dev/null 2>&1; then
|
||||||
|
log "提示: 安装 mold 后取消 .cargo/config.toml 中的相应注释,链接将快 3-5x"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$RELEASE" -eq 1 ]; then
|
if [ "$RELEASE" -eq 1 ]; then
|
||||||
log "构建后端 (cargo build --release)..."
|
log "构建后端 (cargo build --release)..."
|
||||||
cargo build --release
|
cargo build --release
|
||||||
@@ -76,6 +104,44 @@ if [ "$FRONTEND_ONLY" -eq 0 ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ── 构建多租户 ComfyUI 镜像 ───────────────────────────────────────────────────
|
||||||
|
# 多租户 ComfyUI 镜像 (boosapi-comfyui:multi-tenant) 由 ComfyUIPool 在每次
|
||||||
|
# 拉新用户容器时使用。镜像很重(~700MB),不必每次 ./build-and-run.sh 都
|
||||||
|
# 重打。优先级:
|
||||||
|
# 1. 已存在同名镜像 → 跳过(--rebuild-image 强制重建)
|
||||||
|
# 2. 有 docker/boosapi-comfyui-multi-tenant-*.tar 备份 → docker load
|
||||||
|
# 3. 都没有 → docker build
|
||||||
|
#
|
||||||
|
# `docker info` 用来确认 daemon 真的在跑,避免在只装了 client 的环境里
|
||||||
|
# 卡 build。失败的话整段跳过,API 仍可走 legacy 单实例路径。
|
||||||
|
|
||||||
|
if [ "$FRONTEND_ONLY" -eq 0 ]; then
|
||||||
|
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
|
||||||
|
IMAGE="boosapi-comfyui:multi-tenant"
|
||||||
|
SAVED_TAR="$(ls "$ROOT_DIR"/docker/boosapi-comfyui-multi-tenant-*.tar 2>/dev/null | head -1 || true)"
|
||||||
|
DOCKERFILE="$ROOT_DIR/docker/Dockerfile.comfyui.multi-tenant"
|
||||||
|
|
||||||
|
if [ "$REBUILD_IMAGE" -eq 0 ] && docker image inspect "$IMAGE" >/dev/null 2>&1; then
|
||||||
|
log "镜像 $IMAGE 已存在,跳过构建(--rebuild-image 强制重建)"
|
||||||
|
elif [ "$REBUILD_IMAGE" -eq 0 ] && [ -n "$SAVED_TAR" ]; then
|
||||||
|
log "从 $SAVED_TAR 加载 $IMAGE..."
|
||||||
|
docker load -i "$SAVED_TAR"
|
||||||
|
ok "镜像已加载 → $IMAGE"
|
||||||
|
elif [ -f "$DOCKERFILE" ]; then
|
||||||
|
log "构建多租户 ComfyUI 镜像 ($IMAGE)..."
|
||||||
|
docker build \
|
||||||
|
-f "$DOCKERFILE" \
|
||||||
|
-t "$IMAGE" \
|
||||||
|
"$ROOT_DIR"
|
||||||
|
ok "ComfyUI 多租户镜像构建完成 → $IMAGE"
|
||||||
|
else
|
||||||
|
log "未找到 $DOCKERFILE,跳过镜像构建"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "docker 不可用(未安装或 daemon 未运行),跳过多租户 ComfyUI 镜像准备"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# ── 启动服务 ──────────────────────────────────────────────────────────────────
|
# ── 启动服务 ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
if [ "$NO_RUN" -eq 1 ] || [ "$FRONTEND_ONLY" -eq 1 ]; then
|
if [ "$NO_RUN" -eq 1 ] || [ "$FRONTEND_ONLY" -eq 1 ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user