
Configuración de Whisper con Docker: guía completa para ejecutar OpenAI Whisper en Docker
Eric King
Author
Introducción
Ejecutar OpenAI Whisper en contenedores Docker ofrece un entorno consistente y aislado que simplifica el despliegue y evita el problema de «en mi máquina sí funciona». Docker facilita:
- Desplegar en cualquier sitio – el mismo contenedor en cualquier plataforma compatible con Docker
- Aislar dependencias – evitar conflictos con paquetes del sistema
- Escalar con facilidad – levantar varios contenedores para procesamiento en paralelo
- Control de versiones – fijar versiones y configuraciones concretas de Whisper
- Simplificar el despliegue – un solo comando para todo
Esta guía cubre lo necesario para configurar Whisper en Docker, desde contenedores básicos hasta configuraciones listas para producción con soporte GPU.
¿Por qué usar Docker para Whisper?
Ventajas de la containerización
1. Consistencia
- el mismo entorno en desarrollo, staging y producción
- sin conflictos de dependencias
- builds reproducibles
2. Portabilidad
- ejecución en cualquier plataforma con Docker
- migración sencilla entre servidores
- despliegue independiente del proveedor cloud
3. Aislamiento
- sin interferir con el sistema anfitrión
- desinstalación limpia (solo eliminar el contenedor)
- seguridad mediante aislamiento
4. Escalabilidad
- escalado horizontal sencillo
- balanceo de carga entre contenedores
- límites de recursos por contenedor
5. Integración DevOps
- compatible con pipelines CI/CD
- preparado para Kubernetes
- adecuado para despliegues en la nube
Requisitos previos
Antes de empezar, asegúrate de tener:
- Docker instalado (versión 20.10+)
- Docker Compose (opcional, para varios contenedores)
- NVIDIA Docker (opcional, para soporte GPU)
- conocimientos básicos de comandos de Docker
Instalar 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:
Descarga Docker Desktop desde docker.com
Verificar la instalación
docker --version
docker-compose --version
Dockerfile básico para Whisper
Empecemos con un Dockerfile sencillo para 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"]
Construir la imagen
docker build -t whisper:latest .
Ejecutar el contenedor básico
docker run --rm whisper:latest whisper --version
Dockerfile con servidor API
En producción suele hacer falta un servidor API. Aquí un Dockerfile más 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"]
Ejemplo de servidor 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
Configuración con Docker Compose
Para un entorno completo con varios servicios, 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:
Ejecutar con Docker Compose
# Start services
docker-compose up -d
# View logs
docker-compose logs -f whisper-api
# Stop services
docker-compose down
Soporte GPU con Docker
Para aceleración por GPU necesitas el runtime de NVIDIA para Docker:
Instalar 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 soporte 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"]
Ejecutar 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 optimizado para producción
Aquí tienes un Dockerfile listo para producción con optimizaciones:
# 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"]
Ventajas del build multietapa
- Imagen más pequeña – solo dependencias de ejecución en la imagen final
- Builds más rápidos – caché separada para dependencias de compilación
- Mayor seguridad – usuario no root y superficie de ataque reducida
Variables de entorno
Haz tu configuración de Docker parametrizable con variables de entorno:
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 variables de entorno
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
Archivo .env
WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0
Gestión de volúmenes
Una configuración adecuada de volúmenes garantiza la persistencia de datos:
docker-compose.yml con volúmenes
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
Ventajas
- Caché de modelos – los modelos se descargan una vez y se reutilizan
- Persistencia de datos – los archivos de salida sobreviven a reinicios del contenedor
- Configuración – actualizar configs sin reconstruir la imagen
Comprobaciones de salud y monitorización
Dockerfile con comprobación de salud
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 de 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
Casos de uso habituales
Caso 1: Entorno de desarrollo
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: Producción con cola
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: Varios modelos
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
Buenas prácticas
1. Usar imágenes base específicas
Mal:
FROM python:latest
Bien:
FROM python:3.10-slim
2. Minimizar capas
Mal:
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
Bien:
RUN apt-get update && apt-get install -y \
ffmpeg \
git \
&& rm -rf /var/lib/apt/lists/*
3. Usar .dockerignore
Crea
.dockerignore:__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store
4. Definir límites de recursos
services:
whisper-api:
build: .
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
5. Usar comprobaciones de salud
Incluye siempre health checks en contenedores de producción:
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1
6. Usuario no root
Ejecuta los contenedores como usuario no privilegiado:
RUN useradd -m -u 1000 whisper
USER whisper
7. Cachear modelos
Usa volúmenes para cachear modelos descargados:
volumes:
- whisper-models:/root/.cache/whisper
Solución de problemas frecuentes
Problema 1: El contenedor sale al instante
Problema: el contenedor arranca y termina de inmediato
Solución:
# Check logs
docker logs <container-id>
# Run interactively to debug
docker run -it whisper:latest /bin/bash
Problema 2: GPU no disponible
Problema: la GPU no se detecta en el contenedor
Solución:
# 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: Sin memoria
Problema: el contenedor se queda sin memoria
Solución:
# Increase memory limit
deploy:
resources:
limits:
memory: 8G
Problema 4: Descarga lenta del modelo
Problema: los modelos se descargan en cada arranque
Solución:
# Use volume for model cache
volumes:
- whisper-models:/root/.cache/whisper
Problema 5: Permiso denegado
Problema: no se puede escribir en los volúmenes
Solución:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app
Optimización del rendimiento
1. Precarga del modelo
Precarga modelos en el Dockerfile:
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"
2. Usar faster-whisper
Para mejor rendimiento, usa faster-whisper:
RUN pip install --no-cache-dir faster-whisper
3. Multihilo
Configura procesos worker:
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
4. Asignación de recursos
Asigna recursos adecuados:
deploy:
resources:
limits:
cpus: '4'
memory: 8G
Consideraciones de seguridad
1. Usar imágenes base oficiales
FROM python:3.10-slim # Official Python image
2. Escanear vulnerabilidades
docker scan whisper:latest
3. Mantener imágenes actualizadas
Actualiza periódicamente imágenes base y dependencias:
FROM python:3.10-slim # Use latest patch version
RUN pip install --upgrade pip
4. Limitar el acceso de red
services:
whisper-api:
build: .
networks:
- internal
# No external ports if accessed via reverse proxy
Conclusión
Dockerizar Whisper ofrece una solución robusta y escalable para la transcripción voz a texto. Ideas clave:
- Empezar simple – con un Dockerfile básico
- Usar Docker Compose – para stacks con varios servicios
- Activar GPU – para rendimiento en producción
- Seguir buenas prácticas – seguridad, optimización, monitorización
- Probar a fondo – antes de pasar a producción
Con una configuración Docker adecuada puedes desplegar Whisper de forma coherente en cualquier entorno, desde desarrollo local hasta producción en la nube.
Próximos pasos
- Construye tu primer contenedor – empieza con el Dockerfile básico
- Añade soporte GPU – si tienes GPUs NVIDIA
- Configura Docker Compose – para la pila completa de la aplicación
- Despliega en la nube – usa servicios de contenedores (ECS, GKE, AKS)
Para más estrategias de despliegue, consulta nuestras guías sobre Whisper Cloud Deployment y Whisper API vs Local Deployment.
