Whisper Docker 配置:在 Docker 中运行 OpenAI Whisper 的完整指南

Whisper Docker 配置:在 Docker 中运行 OpenAI Whisper 的完整指南

Eric King

Eric King

Author


简介

在 Docker 容器中运行 OpenAI Whisper 可以获得一致、隔离的环境,简化部署并减少「在我机器上能跑」的问题。借助 Docker,你可以:
  • 随处部署 – 在任何支持 Docker 的平台上运行同一镜像
  • 隔离依赖 – 避免与系统包冲突
  • 轻松扩展 – 启动多个容器并行处理
  • 版本可控 – 固定 Whisper 版本与配置
  • 简化上线 – 一条命令拉起整套环境
本指南涵盖在 Docker 中搭建 Whisper 所需的全部内容:从基础容器到支持 GPU、可上生产的配置。

为什么用 Docker 运行 Whisper?

容器化的优势

1. 一致性
  • 开发、预发布与生产环境一致
  • 减少依赖冲突
  • 构建可复现
2. 可移植性
  • 凡有 Docker 即可运行
  • 服务器间迁移更简单
  • 不绑定特定云厂商
3. 隔离性
  • 不污染宿主机
  • 卸载干净(删除容器即可)
  • 通过隔离提升安全性
4. 可扩展性
  • 水平扩展方便
  • 可在多容器间做负载均衡
  • 可为每个容器设置资源上限
5. 与 DevOps 契合
  • 易于接入 CI/CD
  • 便于对接 Kubernetes
  • 适合云上容器服务

前置条件

开始前请确认已具备:
  • 已安装 Docker(20.10 及以上)
  • Docker Compose(可选,多容器场景)
  • NVIDIA Docker(可选,GPU 场景)
  • 基本的 Docker 命令知识

安装 Docker

macOS:
# Install Docker Desktop from docker.com
# Or using Homebrew
brew install --cask docker
Ubuntu/Debian:
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
Windows:docker.com 下载 Docker Desktop。

验证安装

docker --version
docker-compose --version

Whisper 基础 Dockerfile

先从一个简单的 Whisper Dockerfile 开始:
FROM python:3.10-slim

# Set working directory
WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio

# Copy application code (if you have custom scripts)
# COPY . .

# Set default command
CMD ["whisper", "--help"]

构建镜像

docker build -t whisper:latest .

运行基础容器

docker run --rm whisper:latest whisper --version

带 API 服务的 Dockerfile

生产环境通常需要 API 服务。下面是一个更完整的 Dockerfile:
FROM python:3.10-slim

WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    fastapi \
    uvicorn \
    python-multipart

# Create directories for audio and output
RUN mkdir -p /app/audio /app/output

# Copy application code
COPY app.py .
COPY requirements.txt .

# Expose API port
EXPOSE 8000

# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

# Run API server
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

API 服务示例(app.py)

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import whisper
import os

app = FastAPI()

# Load Whisper model (can be configured via env)
model_name = os.getenv("WHISPER_MODEL", "base")
model = whisper.load_model(model_name)

@app.get("/health")
def health():
    return {"status": "healthy"}

@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...)):
    # Save uploaded file
    file_path = f"/app/audio/{file.filename}"
    with open(file_path, "wb") as f:
        content = await file.read()
        f.write(content)
    
    # Transcribe
    result = model.transcribe(file_path)
    
    # Clean up
    os.remove(file_path)
    
    return JSONResponse(content={
        "text": result["text"],
        "language": result["language"]
    })

requirements.txt

fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
openai-whisper
torch
torchaudio

Docker Compose 配置

若需多服务完整栈,请使用 Docker Compose:

docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    container_name: whisper-api
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    environment:
      - WHISPER_MODEL=base
      - CUDA_VISIBLE_DEVICES=0
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  # Optional: Redis for queue management
  redis:
    image: redis:7-alpine
    container_name: whisper-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:

使用 Docker Compose 启动

# Start services
docker-compose up -d

# View logs
docker-compose logs -f whisper-api

# Stop services
docker-compose down

Docker 中的 GPU 支持

使用 GPU 加速需要 NVIDIA 容器工具包(原 NVIDIA Docker)运行时:

安装 NVIDIA Docker

Ubuntu/Debian:
# Add NVIDIA Docker repository
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# Install
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

支持 GPU 的 Dockerfile

FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04

WORKDIR /app

# Install Python
RUN apt-get update && apt-get install -y \
    python3.10 \
    python3-pip \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies with CUDA support
RUN pip3 install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    --index-url https://download.pytorch.org/whl/cu118

# Install API dependencies
RUN pip3 install --no-cache-dir \
    fastapi \
    uvicorn \
    python-multipart

COPY app.py .
EXPOSE 8000

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

使用 GPU 运行

# Using docker run
docker run --gpus all -p 8000:8000 whisper-gpu:latest

# Using docker-compose

带 GPU 的 docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    container_name: whisper-api-gpu
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

面向生产的优化 Dockerfile

下面是带优化、可上生产的 Dockerfile(多阶段构建):
# Multi-stage build for smaller image
FROM python:3.10-slim as builder

WORKDIR /app

# Install build dependencies
RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install Python packages
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Final stage
FROM python:3.10-slim

WORKDIR /app

# Install runtime dependencies only
RUN apt-get update && apt-get install -y \
    ffmpeg \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# Copy Python packages from builder
COPY --from=builder /root/.local /root/.local

# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH

# Create non-root user for security
RUN useradd -m -u 1000 whisper && \
    mkdir -p /app/audio /app/output && \
    chown -R whisper:whisper /app

USER whisper

# Copy application code
COPY --chown=whisper:whisper app.py .
COPY --chown=whisper:whisper requirements.txt .

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

多阶段构建的好处

  • 镜像更小 – 最终镜像仅含运行时依赖
  • 构建更快 – 编译依赖可单独缓存
  • 更安全 – 非 root 用户、攻击面更小

环境变量配置

通过环境变量让 Docker 配置可切换:

Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    fastapi \
    uvicorn \
    python-multipart

COPY app.py .

# Environment variables with defaults
ENV WHISPER_MODEL=base
ENV MAX_FILE_SIZE=100MB
ENV LOG_LEVEL=INFO

EXPOSE 8000

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

带环境变量的 docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    environment:
      - WHISPER_MODEL=small
      - MAX_FILE_SIZE=200MB
      - LOG_LEVEL=DEBUG
      - CUDA_VISIBLE_DEVICES=0
    env_file:
      - .env
    restart: unless-stopped

.env 文件

WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0

卷(Volume)管理

合理的卷配置可保证数据持久化:

带卷的 docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    volumes:
      # Bind mount for development
      - ./audio:/app/audio
      - ./output:/app/output
      
      # Named volume for model cache (persists across containers)
      - whisper-models:/root/.cache/whisper
      
      # Config volume
      - ./config:/app/config:ro
    environment:
      - WHISPER_MODEL=base

volumes:
  whisper-models:
    driver: local

好处

  • 模型缓存 – 下载一次,多容器复用
  • 数据持久 – 容器重启后输出仍在
  • 配置灵活 – 无需重建镜像即可更新配置

健康检查与监控

带健康检查的 Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    ffmpeg \
    curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
    openai-whisper \
    fastapi \
    uvicorn

COPY app.py .

# Health check endpoint
HEALTHCHECK --interval=30s \
            --timeout=10s \
            --start-period=40s \
            --retries=3 \
            CMD curl -f http://localhost:8000/health || exit 1

EXPOSE 8000
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

健康检查端点

from fastapi import FastAPI
import whisper

app = FastAPI()
model = whisper.load_model("base")

@app.get("/health")
def health():
    try:
        # Quick test transcription
        return {"status": "healthy", "model": "base"}
    except Exception as e:
        return {"status": "unhealthy", "error": str(e)}, 503

常见使用场景

场景一:开发环境

version: '3.8'

services:
  whisper-dev:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/__pycache__
    ports:
      - "8000:8000"
    environment:
      - WHISPER_MODEL=tiny
      - DEBUG=true
    command: uvicorn app.py:app --reload --host 0.0.0.0 --port 8000

场景二:带队列的生产环境

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - REDIS_URL=redis://redis:6379
      - WHISPER_MODEL=small
    depends_on:
      - redis
      - worker

  worker:
    build: .
    command: python worker.py
    environment:
      - REDIS_URL=redis://redis:6379
      - WHISPER_MODEL=small
    volumes:
      - ./audio:/app/audio
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

场景三:多模型部署

version: '3.8'

services:
  whisper-fast:
    build: .
    ports:
      - "8001:8000"
    environment:
      - WHISPER_MODEL=tiny
      - PORT=8000

  whisper-balanced:
    build: .
    ports:
      - "8002:8000"
    environment:
      - WHISPER_MODEL=base
      - PORT=8000

  whisper-accurate:
    build: .
    ports:
      - "8003:8000"
    environment:
      - WHISPER_MODEL=large
      - PORT=8000

最佳实践

1. 使用明确版本的基础镜像

不推荐:
FROM python:latest
推荐:
FROM python:3.10-slim

2. 减少镜像层

不推荐:
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
推荐:
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    && rm -rf /var/lib/apt/lists/*

3. 使用 .dockerignore

创建 .dockerignore
__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store

4. 设置资源限制

services:
  whisper-api:
    build: .
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '1'
          memory: 2G

5. 使用健康检查

生产容器应始终配置健康检查:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. 非 root 用户

RUN useradd -m -u 1000 whisper
USER whisper

7. 缓存模型

用卷缓存已下载模型:
volumes:
  - whisper-models:/root/.cache/whisper

常见问题排查

问题一:容器立刻退出

现象: 启动后马上结束
处理:
# Check logs
docker logs <container-id>

# Run interactively to debug
docker run -it whisper:latest /bin/bash

问题二:GPU 不可用

现象: 容器内检测不到 GPU
处理:
# Verify NVIDIA Docker
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

# Check runtime
docker info | grep -i runtime

问题三:内存不足

现象: 容器 OOM
处理:
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

问题四:模型下载慢或每次重启都下载

现象: 每次启动都重新拉模型
处理:
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

问题五:权限拒绝

现象: 无法写入卷
处理:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

性能优化

1. 预加载模型

在 Dockerfile 构建阶段下载模型:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. 使用 faster-whisper

追求更高吞吐可使用 faster-whisper:
RUN pip install --no-cache-dir faster-whisper

3. 多进程

配置 worker 数量:
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

4. 资源分配

按负载分配 CPU 与内存:
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

安全考量

1. 使用官方基础镜像

FROM python:3.10-slim  # Official Python image

2. 漏洞扫描

docker scan whisper:latest

3. 保持镜像更新

定期更新基础镜像与依赖:
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. 限制网络暴露

services:
  whisper-api:
    build: .
    networks:
      - internal
    # No external ports if accessed via reverse proxy

总结

将 Whisper 容器化可获得稳健、可扩展的语音转文字方案。要点如下:
  1. 从简入手 – 先写基础 Dockerfile
  2. 善用 Docker Compose – 简化多服务栈
  3. 启用 GPU – 生产环境需要性能时
  4. 遵循最佳实践 – 安全、优化与可观测性
  5. 充分测试 – 再上生产
配置得当的 Docker 方案能让你在本地开发到云上生产之间,一致地部署 Whisper。

后续步骤

  • 构建第一个容器 – 从基础 Dockerfile 开始
  • 加入 GPU 支持 – 若有 NVIDIA GPU
  • 配置 Docker Compose – 搭建完整应用栈
  • 部署到云端 – 使用 ECS、GKE、AKS 等容器服务

立即免費試用

現在就體驗我們的 AI 語音與音視頻服務!不僅可以享受高精度語音轉文字、多語言翻譯與智能說話人識別,還能自動生成視頻字幕、智能編輯音視頻內容並進行聲畫同步分析,全面覆蓋會議記錄、短視頻創作、播客製作等場景——立即開始免費試用吧!