
Configurazione Whisper con Docker: guida completa per eseguire OpenAI Whisper in Docker
Eric King
Author
Introduzione
Eseguire OpenAI Whisper in container Docker offre un ambiente coerente e isolato che semplifica il deployment ed evita i problemi del tipo «sul mio PC funziona». Docker consente di:
- Distribuire ovunque – lo stesso container su qualsiasi piattaforma compatibile con Docker
- Isolare le dipendenze – evitare conflitti con i pacchetti di sistema
- Scalare facilmente – avviare più container per elaborazione parallela
- Controllare le versioni – fissare versioni e configurazioni specifiche di Whisper
- Semplificare il deployment – un solo comando per tutto
Questa guida copre tutto ciò che serve per configurare Whisper in Docker, dai container di base alle configurazioni pronte per la produzione con supporto GPU.
Perché usare Docker per Whisper?
Vantaggi della containerizzazione
1. Coerenza
- stesso ambiente in sviluppo, staging e produzione
- nessun conflitto di dipendenze
- build riproducibili
2. Portabilità
- esecuzione su qualsiasi piattaforma con Docker
- migrazione semplice tra server
- deployment indipendente dal cloud
3. Isolamento
- nessuna interferenza con il sistema host
- disinstallazione pulita (rimuovere il container)
- sicurezza tramite isolamento
4. Scalabilità
- scaling orizzontale semplice
- bilanciamento del carico tra container
- limiti di risorse per container
5. Integrazione DevOps
- compatibile con pipeline CI/CD
- pronto per Kubernetes
- adatto al deployment cloud
Prerequisiti
Prima di iniziare, assicurati di avere:
- Docker installato (versione 20.10+)
- Docker Compose (opzionale, per setup multi-container)
- NVIDIA Docker (opzionale, per supporto GPU)
- conoscenze di base dei comandi Docker
Installare 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:
Scarica Docker Desktop da docker.com
Verificare l’installazione
docker --version
docker-compose --version
Dockerfile di base per Whisper
Iniziamo con un Dockerfile semplice per 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"]
Costruire l’immagine
docker build -t whisper:latest .
Eseguire il container di base
docker run --rm whisper:latest whisper --version
Dockerfile con server API
In produzione spesso serve un server API. Ecco un Dockerfile più completo:
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"]
Esempio di server 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
Configurazione Docker Compose
Per uno stack completo con più servizi usa 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:
Eseguire con Docker Compose
# Start services
docker-compose up -d
# View logs
docker-compose logs -f whisper-api
# Stop services
docker-compose down
Supporto GPU con Docker
Per l’accelerazione GPU serve il runtime NVIDIA Docker:
Installare 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
Dockerfile con supporto GPU
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"]
Eseguire con GPU
# Using docker run
docker run --gpus all -p 8000:8000 whisper-gpu:latest
# Using docker-compose
docker-compose.yml con 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]
Dockerfile ottimizzato per la produzione
Ecco un Dockerfile pronto per la produzione con ottimizzazioni:
# 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"]
Vantaggi del build multi-stage
- Immagine più piccola – solo dipendenze runtime nell’immagine finale
- Build più veloci – cache separata per le dipendenze di build
- Sicurezza migliore – utente non root, superficie di attacco ridotta
Variabili d’ambiente
Rendi configurabile il setup Docker tramite variabili d’ambiente:
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 con variabili d’ambiente
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
File .env
WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0
Gestione dei volumi
Una configurazione corretta dei volumi garantisce la persistenza dei dati:
docker-compose.yml con volumi
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
Vantaggi
- Cache modelli – download una volta, riuso tra container
- Persistenza dati – i file di output sopravvivono ai riavvii
- Configurazione – aggiornare le config senza ricostruire l’immagine
Health check e monitoraggio
Dockerfile con 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"]
Endpoint health check
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
Casi d’uso comuni
Caso 1: ambiente di sviluppo
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
Caso 2: produzione con coda
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:
Caso 3: setup multi-modello
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
Best practice
1. Usare immagini base specifiche
Sbagliato:
FROM python:latest
Giusto:
FROM python:3.10-slim
2. Ridurre i layer
Sbagliato:
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
Giusto:
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
&& rm -rf /var/lib/apt/lists/*
3. Usare .dockerignore
Crea
.dockerignore:__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store
4. Impostare limiti di risorse
services:
whisper-api:
build: .
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
5. Usare health check
Includi sempre health check per i container in produzione:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1
6. Utente non root
Esegui i container come utente non privilegiato:
RUN useradd -m -u 1000 whisper
USER whisper
7. Cache dei modelli
Usa volumi per la cache dei modelli scaricati:
volumes:
- whisper-models:/root/.cache/whisper
Risoluzione dei problemi comuni
Problema 1: il container termina subito
Problema: il container si avvia e poi esce
Soluzione:
# Check logs
docker logs <container-id>
# Run interactively to debug
docker run -it whisper:latest /bin/bash
Problema 2: GPU non disponibile
Problema: la GPU non viene rilevata nel container
Soluzione:
# 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
Problema 3: memoria insufficiente
Problema: il container va fuori memoria
Soluzione:
# Increase memory limit
deploy:
resources:
limits:
memory: 8G
Problema 4: download del modello lento
Problema: i modelli si scaricano a ogni avvio
Soluzione:
# Use volume for model cache
volumes:
- whisper-models:/root/.cache/whisper
Problema 5: permesso negato
Problema: impossibile scrivere sui volumi
Soluzione:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app
Ottimizzazione delle prestazioni
1. Precaricamento del modello
Precarica i modelli nel Dockerfile:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"
2. Usare faster-whisper
Per prestazioni migliori usa faster-whisper:
RUN pip install --no-cache-dir faster-whisper
3. Multithreading
Configura i processi worker:
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
4. Allocazione risorse
Assegna risorse appropriate:
deploy:
resources:
limits:
cpus: '4'
memory: 8G
Considerazioni sulla sicurezza
1. Usare immagini base ufficiali
FROM python:3.10-slim # Official Python image
2. Scansionare le vulnerabilità
docker scan whisper:latest
3. Aggiornare le immagini
Aggiorna periodicamente immagini base e dipendenze:
FROM python:3.10-slim # Use latest patch version
RUN pip install --upgrade pip
4. Limitare l’accesso di rete
services:
whisper-api:
build: .
networks:
- internal
# No external ports if accessed via reverse proxy
Conclusione
Containerizzare Whisper offre una soluzione robusta e scalabile per la trascrizione voce-testo. Punti chiave:
- Iniziare in modo semplice – con un Dockerfile di base
- Usare Docker Compose – per stack multi-servizio
- Abilitare la GPU – per le prestazioni in produzione
- Seguire le best practice – sicurezza, ottimizzazione, monitoraggio
- Testare a fondo – prima del deployment in produzione
Con una configurazione Docker adeguata puoi distribuire Whisper in modo coerente in qualsiasi ambiente, dallo sviluppo locale alla produzione cloud.
Passi successivi
- Costruisci il primo container – inizia dal Dockerfile di base
- Aggiungi il supporto GPU – se hai GPU NVIDIA disponibili
- Configura Docker Compose – per l’intero stack applicativo
- Distribuisci sul cloud – servizi container (ECS, GKE, AKS)
Per altre strategie di deployment consulta le nostre guide su Whisper Cloud Deployment e Whisper API vs Local Deployment.
