docker-compose.yml
Rama main · réplica de lectura del repositorio original.
# MiniMax-H3-Lite — 单机 GPU 工作台编排
#
# 用法:
# docker compose up -d --build
# docker compose logs -f mmh3
# docker compose down
#
# 安全默认:仅绑定本机回环(127.0.0.1:18080)。
# 如需局域网/公网暴露,改为 `0.0.0.0:18080:18080` 并经反向代理(nginx/caddy)+ 鉴权,
# 因为本工作台 API 本身无内置认证(见 云原生与容器化评估提示词 P0)。
services:
mmh3:
build:
context: .
dockerfile: Dockerfile
# 不可变 tag:避免 :latest 浮动(评估提示词 §2.8 / 反模式 #5 P1)。
# 语义 tag 与 torch 版本 + CUDA 版本对齐,可复现,是 compose 主文件应保持的形态。
# ⚠ digest 固化【请勿手改下面这一行】:不同机器 image ID 不同,写死 @sha256 会让他人
# build 出的镜像无法匹配(SOP-8 明确禁止在主 compose 写 @sha256)。正确做法:
# ① 单机/团队内不可变 pin → 跑 `pwsh scripts/build_and_pin.ps1`
# (自动 build → tag → 取 image ID → 生成 `docker-compose.pinned.yml` 覆盖层);
# 启动用 `docker compose -f docker-compose.yml -f docker-compose.pinned.yml up -d`
# ② release/CI 级可移植 pin → 先 push 到 registry,取 RepoDigests 后按 SOP-8-B 处理。
image: minimax-h3-lite:2.9.1-cu130
container_name: mmh3-workbench
restart: unless-stopped
# P2-b(评估 v1.0.0 R2):优雅关闭宽限期 15m,覆盖分钟级视频生成
# (INFERENCE_TIMEOUT=600s),避免默认 10s SIGTERM 中断在跑任务。
stop_grace_period: 15m
# P3-b(评估 v1.0.0 R7):显式属主,消除对宿主 preflight/Windows UID 映射的耦合
# (preflight.sh 的 chown 兜底仍保留)。容器内 appuser uid=1000。
user: "1000:1000"
# 本地镜像优先:build 完成后用本地;不主动 pull 远端
# (若需用 registry 拉取镜像,把 build 段删掉即可)
pull_policy: never
# 日志轮转:单文件 10MB × 3 个,防止长跑撑爆磁盘
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
ports:
# 默认仅本机;对外暴露请改 0.0.0.0:18080 并经反代 + 鉴权
- "127.0.0.1:18080:18080"
environment:
# MMH3_PORT 在 Dockerfile ENV 已声明(18080),compose 不再重复;如需覆盖按
# `environment: - MMH3_PORT=19090` 重新加回即可
- HF_HUB_OFFLINE=1
- TRANSFORMERS_OFFLINE=1
- MODELSCOPE_OFFLINE=1
- PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
- COMFYUI_DISABLE_UPDATE_CHECK=1
volumes:
# 注:Windows 主机下 model/ 子目录通常是 NTFS Junction 指 ComfyUI 安装位置。
# Docker Desktop -> WSL2 -> Linux 容器默认会跟随同盘 Junction 成功挂载;
# 跨盘 / 跟随失败 / 迁移到非 Windows 主机时,跑 scripts/convert_model_junctions.ps1
# (默认 dry-run,加 -Apply 才真转换;114GB 级别,磁盘需留出 ~peak+5GB 余量)。
- ./model:/app/model:ro # 权重目录(需事先放置;镜像不含权重)
- ./data:/app/data # SQLite 等运行时数据(持久化)
- ./uploads:/app/uploads # 用户上传(持久化)
- ./outputs:/app/outputs # 生成产物(持久化)
- ./comfy_kernel:/app/comfy_kernel:ro
# ⚠ 卷属主:容器内以 uid 1000(appuser) 运行,宿主机挂载目录若属主不匹配会导致写入失败。
# 首次运行前可 `sudo chown -R 1000:1000 data uploads outputs`,或在部署侧显式指定 user。
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
healthcheck:
# P2-a(评估 v1.0.0 R1 / D1-a):解析 JSON 的 model_loaded,仅模型就绪才 healthy。
# 与 Dockerfile HEALTHCHECK 对齐;模型惰性加载,冷启动未推理前持续 unhealthy
# (restart: unless-stopped 不依 health 重启,仅影响监控直觉)。
test: ["CMD", "python", "-c", "import sys,json,urllib.request; d=json.load(urllib.request.urlopen('http://127.0.0.1:18080/api/health')); sys.exit(0 if d.get('model_loaded') else 1)"]
interval: 30s
timeout: 10s
retries: 3
# H3 模型首次加载常超 2 分钟;冷启动机器建议 300s(与 Dockerfile HEALTHCHECK 一致)
start_period: 300s