#!/usr/bin/env bash # 启动 audio2text 容器(幂等:已在跑则跳过)。 # CPU dev:直接跑 audio2text:cpu # GPU prod:检测到 audio2text:gpu 镜像且 --gpus 可用时走 GPU 模式 set -euo pipefail cd "$(dirname "$0")" ROOT="$(pwd)" CONTAINER="audio2text" PORT="${AUDIO2TEXT_PORT:-8000}" # 已在运行则跳过 if docker ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then echo "audio2text 已在运行:$(docker port $CONTAINER $PORT 2>/dev/null || echo "$PORT")" exit 0 fi # 清理已退出的同名容器 docker rm -f "$CONTAINER" >/dev/null 2>&1 || true # 选镜像:优先 gpu,回退 cpu GPU_ARGS=() IMAGE="audio2text:cpu" if docker image inspect audio2text:gpu >/dev/null 2>&1; then if command -v nvidia-smi >/dev/null 2>&1; then IMAGE="audio2text:gpu" GPU_ARGS=(--gpus all) echo "检测到 GPU 镜像 + nvidia-smi,使用 GPU 模式。" else echo "有 GPU 镜像但本机无 nvidia-smi,回退 CPU 镜像。" fi fi # 数据卷:上传/中间产物/输出 + 模型缓存(跨容器复用,避免重下模型) mkdir -p "$ROOT/data/uploads" "$ROOT/data/.work" "$ROOT/data/outputs" "$ROOT/models" echo "启动容器(镜像 $IMAGE,端口 ${PORT})..." docker run -d --name "$CONTAINER" \ "${GPU_ARGS[@]}" \ -p "${PORT}:8000" \ -v "$ROOT/data:/data" \ -v "$ROOT/models:/models" \ -v "$ROOT/config.yaml:/app/config.yaml:ro" \ -e CONFIG_PATH=/app/config.yaml \ --restart unless-stopped \ "$IMAGE" echo echo "audio2text 已启动:" echo " - 主页(上传 + 最近任务):http://127.0.0.1:${PORT}/" echo " - 历史任务:http://127.0.0.1:${PORT}/history" echo " - 日志页: http://127.0.0.1:${PORT}/logs" echo " - API 文档:http://127.0.0.1:${PORT}/docs" echo " - 容器日志:docker logs -f $CONTAINER" echo " - 停止: ./stop.sh"