Descargar un vídeo de YouTube y convertirlo para el móvil suele acabar en: “descarga una web random, instala un instalador, acepta 5 cajas de anuncios…”. Con Docker + ffmpeg + yt-dlp montas un entorno limpio y reproducible que funciona igual en Windows (WSL), Linux o macOS, sin contaminar tu sistema. En esta guía te enseño mi setup con un contenedor Alpine, un script midu.sh reutilizable y los errores con los que me enfrenté por el camino.
🤔 ¿Qué vamos a conseguir?
- Un contenedor Docker con Alpine que trae
ffmpegyyt-dlpinstalados. - Un script
midu.shcon menú interactivo para descargar, cortar y convertir vídeos. - Los vídeos guardados en tu disco de Windows (
/mnt/c/...) para abrirlos con el reproductor nativo. - Ejecutarlo igual en WSL que en Ubuntu puro (sin Docker) o con Docker.
- Soluciones a los problemas reales: saltos de línea CRLF, permisos
rooty paths con caracteres especiales.
🧰 Prerrequisitos
- Windows con WSL (y una distribución Ubuntu instalada) o Ubuntu directo, Linux o macOS.
- Docker Desktop en Windows (activa la integración WSL) o Docker Engine en Linux.
- Conocimientos básicos de terminal y Docker Compose.
Si te estás iniciando en Docker, te recomiendo primero Docker: instalación y primeros pasos para tener el entorno listo y entender qué es un contenedor antes de lanzarnos al lío.
🐳 El docker-compose.yml
Guardamos los vídeos en el disco de Windows para abrirlos con el reproductor nativo. En WSL, tu disco C: está montado en /mnt/c/. El fichero docker-compose.yml monta esa carpeta dentro del contenedor y arranca un contenedor Alpine con todo lo necesario:
services:
downloader:
image: alpine:latest
container_name: yt_ffmpeg_downloader
volumes:
- /mnt/c/Users/TuUsuario/Videos/test_videos:/test_videos
working_dir: /test_videos
user: root
tty: true
stdin_open: true
command: >-
sh -c "apk update &&
apk add --no-cache ffmpeg bash python3 py3-pip &&
pip install --break-system-packages yt-dlp &&
id -u jorge >/dev/null 2>&1 || adduser -D -u 1000 jorge &&
chown -R jorge:jorge /test_videos &&
su-exec jorge bash midu.sh"
Sobre
ttyestdin_open: equivalen a-itendocker run. Sin ellas no podrías escribir comandos dentro del contenedor.
Sobre los permisos:
user: rootes para poder instalar paquetes; luego consu-execejecutamos el script como tu usuario real (cambiajorgepor el tuyo, lo ves conwhoami).
Ojo: cambia
TuUsuariopor el nombre real de tu usuario de Windows (ls /mnt/c/Users/).
📁 Estructura de carpetas
Tu carpeta test_videos debe quedar así:
test_videos/
├── docker-compose.yml
├── midu.sh
├── conf.json ← se crea automáticamente al guardar config
├── test/ ← meter aquí los vídeos
└── optimizados/ ← se crea automáticamente
🚀 Pasos para ejecutarlo en WSL
1. Activa la integración WSL en Docker Desktop
Abre Docker Desktop en Windows. En Settings → Resources → WSL Integration, activa tu distribución.
2. Lanza el contenedor
docker compose run --remove-orphans --rm downloader
3. Usa el menú interactivo
Dentro del contenedor, el menú de midu.sh se abre automáticamente. Solo selecciona el modo y sigue los pasos.
4. Usa la CLI directamente (opcional)
Si prefieres la terminal sin menú:
bash midu.sh --convert -s telegram # Convertir para Telegram
bash midu.sh --cut -ss 5 -e 10 # Cortar de 5s a 10s
bash midu.sh -d "URL" # Descargar vídeo
bash midu.sh --info # Ver info del vídeo
5. Cierra el contenedor
Al acabar, escribe exit en la terminal del contenedor.
🚀 Ejecutar directamente en Ubuntu (sin Docker)
Si no quieres Docker, instala las dependencias en tu Ubuntu:
sudo apt update && sudo apt install ffmpeg
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp && sudo chmod a+rx /usr/local/bin/yt-dlp
Haz ejecutable el script y ejecútalo:
chmod +x midu.sh
./midu.sh
🚀 Ejecutar con Docker en Ubuntu (sin WSL)
En Ubuntu puro, ajusta las rutas del docker-compose.yml (ya no hay /mnt/c, la ruta es tu home):
volumes:
- /home/TuUsuario/Videos/test_videos:/test_videos
Y lanza el contenedor igual que en WSL:
docker compose run --remove-orphans --rm downloader
🧪 Comprobar que funciona
- Versión de herramientas: dentro del contenedor,
ffmpeg -versionyyt-dlp --versiondevuelven sus números de versión. - Datos del vídeo:
bash midu.sh --info "URL"muestra título, duración y formatos disponibles. - Archivos generados: tras una descarga, en tu carpeta de Windows
Videos/test_videos/(ooptimizados/) aparece el fichero final. - Permisos correctos: los ficheros creados te pertenecen a ti y no a
root(comprueba conls -len la carpeta).
Además puedes verificar que el contenedor habla con tu disco comprobando que la carpeta montada aparece en
working_dir: dentro del contenedorpwddebe mostrar/test_videos.
⚠️ Errores comunes
| Error | Causa | Solución |
|---|---|---|
mkdi: command not found o syntax error near unexpected token 'do' | El docker-compose.yml o midu.sh tiene saltos de línea Windows (CRLF) | Cambia a LF en VS Code (clic en “CRLF” en la barra de estado) |
Archivos creados como root en los volúmenes | El contenedor ejecuta como root | Usa adduser -D -u 1000 tu_usuario + su-exec tu_usuario bash midu.sh |
| ffmpeg no encontraba subtítulos | El path de los subtítulos tenía caracteres especiales | Escapa el path correctamente en el filtro de ffmpeg |
pip mostraba warning por ejecutar como root | Advertencia de seguridad de pip | Redirige: pip install --break-system-packages yt-dlp 2>/dev/null; true |
| No hay permiso de escritura en la carpeta compartida | El usuario del contenedor no es dueño del volumen | Ajusta chown -R al usuario y verifica ls -l de la carpeta |
| Docker no encuentra el contenedor/compose | Docker Desktop sin integración WSL o sin arrancar | Activa la distribución en Settings → Resources → WSL Integration y lanza Docker Desktop |
🪜 Siguiente nivel
- Aprende Docker desde cero si este es tu primer contenedor: Docker: instalación y primeros pasos.
- Domina ffmpeg y yt-dlp a fondo (formatos, subtítulos, recortes, filtros): Guía de ffmpeg y yt-dlp.
- Automatiza todo con la terminal (bucles, scripts, cron) para procesar listas de vídeos: Comandos útiles de terminal.
- Crea tu propio reproductor/pipeline: exporta los vídeos finales por FTP a tu servidor: Cómo conectarse a un servidor FTP.
