
Whisper Docker-Setup: Vollständige Anleitung zum Betrieb von OpenAI Whisper in Docker
Eric King
Author
Einführung
OpenAI Whisper in Docker-Containern auszuführen liefert eine konsistente, isolierte Umgebung, die die Bereitstellung vereinfacht und „bei mir läuft es“-Probleme vermeidet. Mit Docker können Sie:
- Überall bereitstellen – denselben Container auf jeder Docker-kompatiblen Plattform ausführen
- Abhängigkeiten isolieren – Konflikte mit Systempaketen vermeiden
- Einfach skalieren – mehrere Container für parallele Verarbeitung starten
- Versionen steuern – bestimmte Whisper-Versionen und Konfigurationen festnageln
- Bereitstellung vereinfachen – ein Befehl für alles
Dieser Leitfaden deckt alles ab, was Sie für Whisper in Docker brauchen – von einfachen Containern bis zu produktionsreifen Konfigurationen mit GPU-Unterstützung.
Warum Docker für Whisper?
Vorteile der Containerisierung
1. Konsistenz
- dieselbe Umgebung in Entwicklung, Staging und Produktion
- keine Abhängigkeitskonflikte
- reproduzierbare Builds
2. Portabilität
- auf jeder Plattform mit Docker lauffähig
- einfache Migration zwischen Servern
- cloudunabhängige Bereitstellung
3. Isolation
- keine Beeinträchtigung des Host-Systems
- saubere Deinstallation (Container entfernen)
- Sicherheit durch Isolation
4. Skalierbarkeit
- horizontale Skalierung leicht möglich
- Lastverteilung über Container
- Ressourcenlimits pro Container
5. DevOps-Integration
- passt in CI/CD-Pipelines
- Kubernetes-tauglich
- freundlich für Cloud-Deployments
Voraussetzungen
Bevor Sie starten, sollten Sie Folgendes haben:
- Docker installiert (Version 20.10+)
- Docker Compose (optional, für mehrere Container)
- NVIDIA Docker (optional, für GPU-Unterstützung)
- Grundkenntnisse der Docker-Befehle
Docker installieren
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 Desktop von docker.com herunterladen
Installation prüfen
docker --version
docker-compose --version
Einfaches Dockerfile für Whisper
Wir beginnen mit einem einfachen Dockerfile für Whisper:
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"]
Image bauen
docker build -t whisper:latest .
Basis-Container ausführen
docker run --rm whisper:latest whisper --version
Dockerfile mit API-Server
Für den Produktiveinsatz wollen Sie oft einen API-Server. Hier ein vollständigeres 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"]
Beispiel-API-Server (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-Setup
Für ein vollständiges Setup mit mehreren Diensten nutzen Sie 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:
Mit Docker Compose ausführen
# Start services
docker-compose up -d
# View logs
docker-compose logs -f whisper-api
# Stop services
docker-compose down
GPU-Unterstützung mit Docker
Für GPU-Beschleunigung benötigen Sie die NVIDIA-Docker-Runtime:
NVIDIA Docker installieren
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
Dockerfile mit GPU-Unterstützung
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"]
Mit GPU ausführen
# Using docker run
docker run --gpus all -p 8000:8000 whisper-gpu:latest
# Using docker-compose
docker-compose.yml mit GPU
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]
Optimiertes Dockerfile für die Produktion
Hier ein produktionsreifes Dockerfile mit Optimierungen:
# 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"]
Vorteile des mehrstufigen Builds
- kleineres Image – nur Laufzeitabhängigkeiten im finalen Image
- schnellere Builds – Build-Abhängigkeiten separat cachen
- bessere Sicherheit – Non-Root-Nutzer, minimale Angriffsfläche
Umgebungsvariablen
Machen Sie Ihr Docker-Setup per Umgebungsvariablen konfigurierbar:
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 mit Umgebungsvariablen
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-Datei
WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0
Volume-Verwaltung
Eine sinnvolle Volume-Konfiguration sorgt für dauerhafte Daten:
docker-compose.yml mit Volumes
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
Vorteile
- Modell-Caching – Modelle einmal herunterladen, in Containern wiederverwenden
- Datenhaltbarkeit – Ausgabedateien über Container-Neustarts hinweg
- Konfiguration – Konfigurationen ohne Rebuild anpassen
Health Checks und Monitoring
Dockerfile mit Health Check
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"]
Health-Check-Endpunkt
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
Typische Anwendungsfälle
Anwendungsfall 1: Entwicklungsumgebung
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
Anwendungsfall 2: Produktion mit Warteschlange
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:
Anwendungsfall 3: Mehrere Modelle
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
Bewährte Verfahren
1. Spezifische Basis-Images verwenden
Schlecht:
FROM python:latest
Gut:
FROM python:3.10-slim
2. Schichten minimieren
Schlecht:
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
Gut:
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
&& rm -rf /var/lib/apt/lists/*
3. .dockerignore nutzen
.dockerignore anlegen:__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store
4. Ressourcenlimits setzen
services:
whisper-api:
build: .
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
5. Health Checks verwenden
Für Produktionscontainer immer Health Checks einplanen:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1
6. Non-Root-Benutzer
Container als Non-Root ausführen:
RUN useradd -m -u 1000 whisper
USER whisper
7. Modelle cachen
Volumes zum Cachen heruntergeladener Modelle nutzen:
volumes:
- whisper-models:/root/.cache/whisper
Häufige Probleme
Problem 1: Container beendet sich sofort
Problem: Container startet und beendet sich gleich wieder
Lösung:
# Check logs
docker logs <container-id>
# Run interactively to debug
docker run -it whisper:latest /bin/bash
Problem 2: GPU nicht verfügbar
Problem: GPU wird im Container nicht erkannt
Lösung:
# 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
Problem 3: Speicher voll
Problem: Container geht dem Speicher aus
Lösung:
# Increase memory limit
deploy:
resources:
limits:
memory: 8G
Problem 4: Langsamer Modelldownload
Problem: Modelle werden bei jedem Start neu geladen
Lösung:
# Use volume for model cache
volumes:
- whisper-models:/root/.cache/whisper
Problem 5: Zugriff verweigert
Problem: Schreiben auf Volumes nicht möglich
Lösung:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app
Leistungsoptimierung
1. Modell vorladen
Modelle im Dockerfile vorladen:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"
2. Faster-Whisper nutzen
Für bessere Performance: faster-whisper:
RUN pip install --no-cache-dir faster-whisper
3. Multithreading
Worker-Prozesse konfigurieren:
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
4. Ressourcen zuweisen
Passende Ressourcen zuweisen:
deploy:
resources:
limits:
cpus: '4'
memory: 8G
Sicherheit
1. Offizielle Basis-Images
FROM python:3.10-slim # Official Python image
2. Auf Schwachstellen prüfen
docker scan whisper:latest
3. Images aktuell halten
Basis-Images und Abhängigkeiten regelmäßig aktualisieren:
FROM python:3.10-slim # Use latest patch version
RUN pip install --upgrade pip
4. Netzwerkzugriff begrenzen
services:
whisper-api:
build: .
networks:
- internal
# No external ports if accessed via reverse proxy
Fazit
Whisper in Docker zu packen liefert eine robuste, skalierbare Lösung für Sprache-zu-Text. Wichtige Punkte:
- Einfach starten – mit einem einfachen Dockerfile beginnen
- Docker Compose nutzen – mehrere Dienste vereinfachen
- GPU aktivieren – für Produktionsleistung
- Best Practices – Sicherheit, Optimierung, Monitoring
- Gründlich testen – vor dem Produktions-Deployment
Mit einem durchdachten Docker-Setup können Sie Whisper konsistent in jeder Umgebung bereitstellen – von der lokalen Entwicklung bis zur Cloud-Produktion.
Nächste Schritte
- Ersten Container bauen – mit dem einfachen Dockerfile starten
- GPU-Unterstützung – wenn NVIDIA-GPUs verfügbar sind
- Docker Compose einrichten – für den gesamten Anwendungsstack
- In der Cloud deployen – Containerdienste der Cloud nutzen (ECS, GKE, AKS)
Weitere Deployment-Strategien finden Sie in unseren Leitfäden zu Whisper Cloud Deployment und Whisper API vs Local Deployment.
