12 KiB
12 KiB
🐳 SIDEL ScriptsManager - Guía de Docker Build
📋 Flujo de Trabajo para Cambios en Scripts
🔄 Cambios Regulares en Scripts (Sin reconstruir imagen)
Para cambios en scripts que están en volúmenes montados:
# 1. Realizar cambios en:
# - app/backend/script_groups/
# - Archivos de configuración Python
# 2. Reiniciar solo el contenedor (NO reconstruir imagen)
sudo ./docker-manage.sh restart
# 3. Verificar cambios
sudo ./docker-manage.sh logs
✅ Ventaja: Los volúmenes montados reflejan cambios inmediatamente.
🏗️ Cambios que Requieren Reconstruir Imagen
Reconstruir imagen cuando cambies:
- Dockerfile
- requirements.txt o requirements-dev.txt
- app/backend/script_groups/hammer/requirements.txt (TSNet)
- Estructura de directorios dentro del contenedor
- Scripts de inicialización (docker-entrypoint.sh)
- Entornos conda (agregar/modificar)
🔨 Proceso Completo de Rebuild
# 1. Detener contenedor actual
sudo ./docker-manage.sh stop
# 2. Reconstruir imagen (esto puede tomar varios minutos)
sudo ./docker-manage.sh build
# 3. Iniciar con nueva imagen
sudo ./docker-manage.sh start
# 4. Verificar que todo funciona
sudo ./verify-environments.sh
⚡ Comando Rápido de Rebuild
# Todo en una línea
sudo ./docker-manage.sh rebuild
# O manualmente:
sudo ./docker-manage.sh stop && sudo ./docker-manage.sh build && sudo ./docker-manage.sh start
🐍 Agregar Nuevo Entorno Miniconda
Paso 1: Modificar Dockerfile
Agregar el nuevo entorno después de los existentes:
# Entornos existentes (scriptsmanager, tsnet)
# ...
# NUEVO ENTORNO: ejemplo para análisis de datos
RUN conda create -n data_analysis python=3.12 -y
# Instalar dependencias específicas del nuevo entorno
RUN /opt/conda/envs/data_analysis/bin/pip install --no-cache-dir \
pandas>=2.0.0 \
numpy>=1.24.0 \
scipy>=1.10.0 \
scikit-learn>=1.3.0 \
jupyter>=1.0.0
Paso 2: Actualizar Variables de Entorno (Opcional)
En docker-compose.yml
:
environment:
# Entornos existentes
- CONDA_DEFAULT_ENV=scriptsmanager
- TSNET_ENV=tsnet
# Nuevo entorno
- DATA_ANALYSIS_ENV=data_analysis
Paso 3: Crear Archivo de Requirements (Opcional)
Crear requirements-data-analysis.txt
:
pandas>=2.0.0
numpy>=1.24.0
scipy>=1.10.0
scikit-learn>=1.3.0
jupyter>=1.0.0
seaborn>=0.12.0
plotly>=5.15.0
Luego modificar Dockerfile:
# Copiar requirements del nuevo entorno
COPY requirements-data-analysis.txt ./
# Crear e instalar en el nuevo entorno
RUN conda create -n data_analysis python=3.12 -y
RUN /opt/conda/envs/data_analysis/bin/pip install --no-cache-dir -r requirements-data-analysis.txt
Paso 4: Actualizar Script de Verificación
Modificar verify-environments.sh
:
# Verificar nuevo entorno data_analysis
echo "🔍 Verificando entorno data_analysis..."
DATA_ANALYSIS_PYTHON=$(docker exec sidel_scriptsmanager bash -c "source activate data_analysis && python --version")
echo " Python version: $DATA_ANALYSIS_PYTHON"
PANDAS_VERSION=$(docker exec sidel_scriptsmanager bash -c "source activate data_analysis && python -c 'import pandas; print(f\"Pandas {pandas.__version__}\")'" 2>/dev/null)
if [ $? -eq 0 ]; then
echo " ✅ $PANDAS_VERSION"
else
echo " ❌ Error importando Pandas"
fi
Paso 5: Rebuild y Verificar
# Reconstruir con nuevo entorno
sudo ./docker-manage.sh rebuild
# Verificar nuevo entorno
sudo ./docker-manage.sh shell
conda env list
conda activate data_analysis
python -c "import pandas; print('Pandas funcionando!')"
exit
📁 Estructura de Archivos para Nuevos Entornos
Opción 1: Requirements Separados
SIDELManagerScripts/
├── Dockerfile
├── requirements.txt # Entorno scriptsmanager
├── requirements-tsnet.txt # Entorno TSNet (ya existe)
├── requirements-data-analysis.txt # Nuevo entorno
├── requirements-ml.txt # Otro entorno futuro
└── docker-compose.yml
Opción 2: Estructura Organizada
SIDELManagerScripts/
├── Dockerfile
├── docker/
│ ├── environments/
│ │ ├── scriptsmanager.txt
│ │ ├── tsnet.txt
│ │ ├── data-analysis.txt
│ │ └── machine-learning.txt
│ └── scripts/
└── docker-compose.yml
🔧 Comandos de Gestión de Entornos
Listar Entornos Disponibles
# Desde host
sudo ./docker-manage.sh envs
# Desde dentro del contenedor
sudo ./docker-manage.sh shell
conda env list
Probar Entorno Específico
# Acceder al contenedor
sudo ./docker-manage.sh shell
# Cambiar a entorno específico
conda activate data_analysis
# Probar importaciones
python -c "import pandas, numpy, scipy; print('Todo OK!')"
# Salir
exit
Agregar Paquetes a Entorno Existente
# Método 1: Desde contenedor (temporal)
sudo ./docker-manage.sh shell
conda activate data_analysis
pip install matplotlib
exit
# Método 2: Permanente (modificar Dockerfile + rebuild)
# Editar Dockerfile y hacer rebuild completo
⚠️ Mejores Prácticas
✅ DO (Hacer)
- Usar volúmenes para código que cambia frecuentemente
- Documentar dependencies en requirements.txt separados
- Probar entornos después de cada cambio
- Usar nombres descriptivos para entornos
- Mantener entornos pequeños y especializados
❌ DON'T (No hacer)
- No reconstruir imagen para cambios simples de código
- No mezclar dependencias incompatibles en un entorno
- No olvidar actualizar scripts de verificación
- No usar pip dentro de contenedores para cambios permanentes
- No crear entornos demasiado pesados
🚀 Ejemplos de Entornos Comunes
Entorno de Machine Learning
# Entorno ML
RUN conda create -n machine_learning python=3.12 -y
RUN /opt/conda/envs/machine_learning/bin/pip install --no-cache-dir \
tensorflow>=2.13.0 \
torch>=2.0.0 \
scikit-learn>=1.3.0 \
pandas>=2.0.0 \
numpy>=1.24.0 \
matplotlib>=3.7.0 \
seaborn>=0.12.0 \
jupyter>=1.0.0
Entorno de Web Scraping
# Entorno Web Scraping
RUN conda create -n web_scraping python=3.12 -y
RUN /opt/conda/envs/web_scraping/bin/pip install --no-cache-dir \
requests>=2.31.0 \
beautifulsoup4>=4.12.0 \
selenium>=4.15.0 \
scrapy>=2.11.0 \
pandas>=2.0.0 \
lxml>=4.9.0
Entorno de Procesamiento de Imágenes
# Entorno Image Processing
RUN conda create -n image_processing python=3.12 -y
RUN /opt/conda/envs/image_processing/bin/pip install --no-cache-dir \
opencv-python>=4.8.0 \
pillow>=10.0.0 \
scikit-image>=0.21.0 \
matplotlib>=3.7.0 \
numpy>=1.24.0
📝 Checklist para Agregar Nuevo Entorno
- Crear archivo requirements-[nombre].txt
- Modificar Dockerfile con nuevo entorno
- Actualizar docker-compose.yml (variables de entorno)
- Actualizar verify-environments.sh
- Reconstruir imagen:
sudo ./docker-manage.sh rebuild
- Verificar funcionamiento:
sudo ./verify-environments.sh
- Probar entorno manualmente:
sudo ./docker-manage.sh shell
- Documentar uso del nuevo entorno
🔍 Troubleshooting
Problema: Error al construir imagen
# Ver logs detallados
sudo ./docker-manage.sh build | tee build.log
# Limpiar cache de Docker
docker system prune -f
Problema: Entorno no aparece
# Verificar que se creó correctamente
sudo ./docker-manage.sh shell
conda env list
Problema: Conflictos de dependencias
# Crear entorno limpio y probar dependencias una por una
conda create -n test_env python=3.12 -y
conda activate test_env
pip install paquete1
pip install paquete2 # Ver si hay conflicto
🛠️ Comandos de Gestión Rápidos
Verificar Estado Actual
# Ver contenedores activos
sudo ./docker-manage.sh status
# Ver entornos conda disponibles
sudo ./docker-manage.sh envs
# Verificar salud del sistema
sudo ./docker-manage.sh health
# Ver logs en tiempo real
sudo ./docker-manage.sh logs
Comandos de Desarrollo Frecuentes
# Rebuild completo (cuando cambias dependencies)
sudo ./docker-manage.sh rebuild
# Ver flujo de trabajo
sudo ./docker-manage.sh workflow
# Solo reiniciar (para cambios de código)
sudo ./docker-manage.sh restart
# Acceder al contenedor para debug
sudo ./docker-manage.sh shell
Verificar Después de Cambios
# Verificar todos los entornos
sudo ./verify-environments.sh
# Probar frontend
curl -I http://localhost:5002
# Ver puertos en uso
sudo ./docker-manage.sh ports
📝 Ejemplo Práctico: Agregando Entorno de Data Science
1. Crear archivo de requirements
# Crear requirements-datascience.txt
cat > requirements-datascience.txt << EOF
pandas>=2.0.0
numpy>=1.24.0
scipy>=1.10.0
scikit-learn>=1.3.0
matplotlib>=3.7.0
seaborn>=0.12.0
jupyter>=1.0.0
plotly>=5.15.0
notebook>=6.5.0
EOF
2. Modificar Dockerfile
# Agregar al final del Dockerfile, antes de USER scriptsmanager
# Entorno Data Science
RUN conda create -n datascience python=3.12 -y
# Copiar requirements
COPY requirements-datascience.txt ./
# Instalar dependencias
RUN /opt/conda/envs/datascience/bin/pip install --no-cache-dir -r requirements-datascience.txt
# Limpiar
RUN rm requirements-datascience.txt
3. Ejecutar rebuild
# Rebuild completo
sudo ./docker-manage.sh rebuild
# Verificar nuevo entorno
sudo ./docker-manage.sh shell
conda env list
conda activate datascience
python -c "import pandas, numpy, matplotlib; print('Data Science OK!')"
exit
4. Verificar funcionamiento
# Verificar que el entorno está disponible
sudo ./docker-manage.sh envs | grep datascience
# Ejecutar script de verificación
sudo ./verify-environments.sh
🔍 Debug y Troubleshooting Avanzado
Problema: Imagen muy grande
# Ver tamaño de imagen
docker images | grep scriptsmanager
# Limpiar cache
sudo ./docker-manage.sh clean
# Rebuild desde cero
docker rmi sidel_scriptsmanager_scriptsmanager
sudo ./docker-manage.sh build
Problema: Conflictos de puertos
# Ver puertos ocupados
sudo ./docker-manage.sh ports
# Cambiar puerto en docker-compose.yml
# Buscar SIDEL_APP_PORT=5002 y cambiar
# Reiniciar
sudo ./docker-manage.sh restart
Problema: Entorno no se crea correctamente
# Debug dentro del contenedor
sudo ./docker-manage.sh shell
# Crear entorno manualmente para debugging
conda create -n test_env python=3.12 -y
conda activate test_env
# Instalar paquetes uno por uno
pip install pandas
pip install numpy
# etc...
# Si funciona, el problema está en el Dockerfile
exit
Problema: Sin espacio en disco
# Limpiar Docker completamente
docker system prune -a -f
# Ver uso de espacio
df -h
docker system df
# Limpiar volúmenes no utilizados
docker volume prune -f
⚡ Scripts de Automatización
Script para agregar entorno automáticamente
#!/bin/bash
# add-conda-env.sh
ENV_NAME=$1
REQUIREMENTS_FILE=$2
if [ -z "$ENV_NAME" ] || [ -z "$REQUIREMENTS_FILE" ]; then
echo "Uso: $0 <nombre_entorno> <archivo_requirements>"
exit 1
fi
# Agregar al Dockerfile
cat >> Dockerfile << EOF
# Entorno $ENV_NAME
RUN conda create -n $ENV_NAME python=3.12 -y
COPY $REQUIREMENTS_FILE ./
RUN /opt/conda/envs/$ENV_NAME/bin/pip install --no-cache-dir -r $REQUIREMENTS_FILE
RUN rm $REQUIREMENTS_FILE
EOF
echo "Entorno $ENV_NAME agregado al Dockerfile"
echo "Ejecuta: sudo ./docker-manage.sh rebuild"
Script de verificación personalizado
#!/bin/bash
# verify-custom-env.sh
ENV_NAME=$1
TEST_IMPORTS=$2
if [ -z "$ENV_NAME" ]; then
echo "Uso: $0 <nombre_entorno> [imports_a_probar]"
exit 1
fi
echo "Verificando entorno $ENV_NAME..."
if [ -z "$TEST_IMPORTS" ]; then
TEST_IMPORTS="import sys; print(f'Python {sys.version}')"
fi
docker exec sidel_scriptsmanager bash -c "source activate $ENV_NAME && python -c \"$TEST_IMPORTS\""
if [ $? -eq 0 ]; then
echo "✅ Entorno $ENV_NAME funcionando correctamente"
else
echo "❌ Error en entorno $ENV_NAME"
fi
🎯 Resumen Final:
- Cambios de código:
sudo ./docker-manage.sh restart
- Cambios de dependencias:
sudo ./docker-manage.sh rebuild
- Nuevos entornos: Modificar Dockerfile + rebuild
- Debug:
sudo ./docker-manage.sh shell
+ verificaciones manuales