Este repositorio contiene la configuración de Docker para distintos entornos de JupyterLab. La imagen utiliza Ubuntu 22.04 como base y gestiona sus dependencias mediante Miniconda.
Este proyecto está bajo la Licencia MIT, lo que significa que es de libre uso, copia y distribución, tanto para fines académicos como personales.
Consulta el archivo LICENSE para más detalles (o visita https://opensource.org/licenses/MIT).
El proyecto cuenta con 3 ramas especializadas, cada una optimizada para diferentes casos de uso:
Contiene únicamente el entorno de SageMath. Ideal para cálculo algebraico y matemático avanzado.
- Imagen Docker:
davidgb8246/jupyter-um01:sage-v0.1.1 - Tamaño: Reducido, solo dependencias matemáticas
Contiene únicamente el entorno de Estadística. Perfecto para análisis de datos y visualizaciones estadísticas.
- Imagen Docker:
davidgb8246/jupyter-um01:statistics-v0.1.1 - Tamaño: Ligero, enfocado en análisis de datos
Contiene ambos entornos integrados: SageMath y Estadística. Es la solución completa "todo en uno".
- Imagen Docker:
davidgb8246/jupyter-um01:sage-statistics-v0.1.1(olatest) - Tamaño: Completo, con todas las herramientas
Basado en Python 3.12, incluye:
- Suite completa de
sage jupyterlaby su kernel correspondiente- Herramientas de cálculo algebraico y simbólico
Basado en Python 3.11, incluye:
pandas,numpyyscipypara análisis de datosmatplotlib,seabornypillowpara visualizaciónempiricaldistpara modelado estadístico
- Herramientas de Sistema: Compiladores y utilidades esenciales como
git,cmake,build-essentialycurl
No necesitas construir la imagen localmente. Las imágenes ya se encuentran disponibles en Docker Hub como davidgb8246/jupyter-um01.
Para ejecutar el contenedor con todas las opciones de configuración avanzada, usa el siguiente comando:
docker run -d \
--rm \
-p 7777:8888 \
-e JUPYTER_PASSWD="your_secure_password" \
-e GIT_REPOS="https://github.com/user01/repo01" \
-v $(pwd)/mi_trabajo:/home/jupyter/work \
--name jupyter-um01 \
davidgb8246/jupyter-um01:sage-statistics-v0.1.1| Parámetro | Opcional | Valor Ejemplo | Descripción |
|---|---|---|---|
-d |
✅ Sí | — | Ejecuta el contenedor en modo desatendido (detached). Sin -d: El contenedor bloquea la terminal hasta que se detenga. Con -d: Funciona en segundo plano. Recomendado: Siempre usar para no bloquear la terminal. |
--rm |
✅ Sí | — | Elimina automáticamente el contenedor al detenerlo. Sin --rm: El contenedor permanece en tu sistema consumiendo espacio. Con --rm: Se limpia automáticamente. Recomendado: Usar para desarrollo iterativo y mantener limpio el sistema. |
-p 7777:8888 |
❌ No | 7777 → 8888 |
Mapeo de puertos: Conecta tu máquina local con el contenedor. 7777 es tu puerto local, 8888 el del contenedor. Sin -p: JupyterLab no será accesible desde tu navegador. Con -p: Accedes a través de http://localhost:7777. Puedes usar cualquier puerto disponible en lugar de 7777. |
--name |
✅ Sí | jupyter-um01 |
Nombre identificable del contenedor. Sin --name: Docker asigna un nombre aleatorio. Con --name: Fácil de gestionar con docker stop jupyter-um01 o docker logs jupyter-um01. Recomendado: Facilita la administración. |
| Imagen | ❌ No | davidgb8246/jupyter-um01:sage-statistics-v0.1.1 |
Obligatorio. Especifica cuál imagen y versión usar: sage-vX.X, statistics-vX.X, sage-statistics-vX.X, o latest. Debe ser el último parámetro del comando. |
| Variable | Opcional | Valor Ejemplo | Descripción |
|---|---|---|---|
JUPYTER_PASSWD |
✅ Sí | "tu_contraseña_segura" |
Opcional. Define una contraseña para proteger el acceso a JupyterLab. Sin esta variable: JupyterLab no pide contraseña (útil solo en desarrollo local). Con esta variable: Se cifra automáticamente y requiere contraseña al acceder. Recomendado: Usar en producción o servidores compartidos. |
GIT_REPOS |
✅ Sí | "https://github.com/user01/repo01,https://github.com/user02/repo02" |
Opcional. Repositorios Git que se clonarán automáticamente en /home/jupyter/work/ al iniciar. Sin esta variable: Los directorios de repositorios no se crean automáticamente. Con esta variable: Se descargan los proyectos directamente. Los URLs se separan por comas sin espacios. Recomendado: Usar para cargar proyectos automáticamente. |
| Aspecto | Detalles |
|---|---|
| Propósito | Sincroniza directorios entre tu máquina local y el contenedor. Ambos "ven" los mismos archivos en tiempo real. |
| Sintaxis | -v ruta-local:ruta-contenedor (separa ambas rutas con :) |
| Opcional | ✅ Sí. Sin -v: Los archivos dentro del contenedor se pierden al detenerlo. Con -v: Los datos persisten en tu máquina local. Recomendado: Siempre usar para proteger tu trabajo. |
| Ruta Local | $(pwd)/mi_trabajo — Tu computadora. $(pwd) es el directorio actual. En Windows PowerShell usa: ${PWD}\mi_trabajo. Variantes: Rutas absolutas como /home/usuario/datos o C:\Users\Usuario\datos |
| Ruta Contenedor | /home/jupyter/work — Dentro del contenedor. Es donde aparecen los archivos para JupyterLab. |
| Sincronización | Bidireccional: Los cambios en tu carpeta local se reflejan en el contenedor y viceversa. Archivos creados en JupyterLab aparecen en tu carpeta local. |
| Persistencia | Total: Aunque elimines el contenedor (--rm), los archivos en tu máquina local permanecen intactos. |
| Ejemplos | -v /home/usuario/datos:/home/jupyter/work o -v C:\datos:/home/jupyter/work — Carpeta C:\datos accesible como /home/jupyter/work en el contenedor. |
Reemplaza el tag de imagen según necesites:
# Solo SageMath
davidgb8246/jupyter-um01:sage-v0.1.1
# Solo Estadística
davidgb8246/jupyter-um01:statistics-v0.1.1
# Ambos (SageMath + Estadística)
davidgb8246/jupyter-um01:sage-statistics-v0.1.1
# o simplemente:
davidgb8246/jupyter-um01:latestUna vez ejecutado el comando anterior, abre tu navegador web y dirígete a:
http://localhost:7777
Nota: Si usaste
JUPYTER_PASSWD="your_secure_password", ingresa esa contraseña en la pantalla de autenticación.
Ejecuta directamente el script de despliegue de cada rama. Los scripts permiten parametrización completa de la ejecución para personalizar el puerto, nombre del contenedor y repositorios Git a clonar.
Parámetros Disponibles:
| Parámetro | Tipo | Por Defecto | Descripción |
|---|---|---|---|
APP_PORT |
Número | 7777 |
Puerto local en el que se ejecutará JupyterLab. Debe estar disponible en tu sistema. |
CONTAINER_NAME |
Texto | Varía por rama | Nombre identificable del contenedor Docker (sage: jupyter-sage, statistics: jupyter-stats, sage-statistics: jupyter-sage-statistics). |
GIT_REPOS |
URL/URLs | Vacío (opcional) | Repositorio(s) Git a clonar automáticamente en /home/jupyter/work. Múltiples repos separados por comas sin espacios. Ejemplo: https://github.com/user/repo1,https://github.com/user/repo2 |
SHOW_ALL_IPS |
Booleano / Texto | Vacío | Si se establece, muestra todas las direcciones IP de la máquina además de localhost y 127.0.0.1. Por defecto, solo se muestran las direcciones locales. |
Rama SageMath:
curl -fsSL https://jupyter-um01.davidgb.net/sage/run.sh | bashCon parámetros personalizados:
curl -fsSL https://jupyter-um01.davidgb.net/sage/run.sh | APP_PORT=8888 CONTAINER_NAME=mi-sage GIT_REPOS="https://github.com/usuario/repo" bashRama Estadística:
curl -fsSL https://jupyter-um01.davidgb.net/statistics/run.sh | bashCon parámetros personalizados:
curl -fsSL https://jupyter-um01.davidgb.net/statistics/run.sh | APP_PORT=8888 CONTAINER_NAME=mi-stats GIT_REPOS="https://github.com/usuario/repo" bashRama SageMath + Estadística (Completa):
curl -fsSL https://jupyter-um01.davidgb.net/sage-statistics/run.sh | bashCon parámetros personalizados:
curl -fsSL https://jupyter-um01.davidgb.net/sage-statistics/run.sh | APP_PORT=8888 CONTAINER_NAME=mi-jupyter GIT_REPOS="https://github.com/user/repo1,https://github.com/user/repo2" bashNotas sobre los scripts:
- Los scripts crean automáticamente el directorio de trabajo
mi_trabajoen el directorio actual si no existe. - El contenedor se ejecuta con la flag
--rm, lo que significa que se limpia automáticamente al detenerlo. - Al iniciar, los scripts esperan a que JupyterLab esté disponible (máximo 15 intentos con 2 segundos entre intentos).
- Se mostrarán todas las direcciones disponibles para acceder a JupyterLab (localhost, 127.0.0.1 y direcciones IP locales si aplica).
-
Script: El contenedor incluye el script de inicialización clone_repos.sh que gestiona la clonación y actualización automática de repositorios indicados en la variable de entorno
GIT_REPOS. -
Destino: Los repositorios se clonan o actualizan en el directorio
/home/jupyter/workdentro del contenedor. -
Formato:
GIT_REPOSacepta una lista separada por comas (sin espacios). Ejemplo:https://github.com/user/repo1,https://github.com/user/repo2. -
Comportamiento principal:
- Si
GIT_REPOSno está definida, el script sale sin errores y no se realiza ninguna clonación. - Se dividen las URL por comas y se limpian espacios en blanco alrededor de cada entrada (se ignoran entradas vacías).
- Para cada repositorio:
- Primera ejecución (repositorio no existe): Se clona completamente en
/home/jupyter/work/<nombre_repo>y todos los archivos se registran como gestionados por el script en el archivo.sync_state. - Actualizaciones posteriores (repositorio ya existe): El script realiza una sincronización inteligente:
- Verifica si hay cambios en el repositorio remoto comparando commits locales y remotos.
- Si hay cambios, crea una copia temporal del repositorio remoto para obtener el estado actualizado de todos los archivos.
- Compara archivos locales con los de la copia temporal:
- Archivos existentes en remoto pero modificados localmente se preservan (no se sobrescriben).
- Archivos existentes en remoto y no modificados localmente se actualizan automáticamente.
- Archivos nuevos en remoto se agregan y se registran en
.sync_state. - Archivos eliminados en remoto se eliminan localmente solo si no han sido modificados por el usuario; los archivos locales modificados se preservan.
- Los archivos
.gitse actualizan siempre para mantener la metadata del repositorio sincronizada, pero nunca se registran en.sync_state. - Los archivos de usuario que no están gestionados por el script se preservan completamente, incluso si fueron eliminados o modificados en remoto.
- Primera ejecución (repositorio no existe): Se clona completamente en
- Si
-
Estrategia de actualización de archivos:
- ✅ Se actualizan automáticamente:
- Archivos nuevos o modificados en remoto que no fueron modificados localmente.
- Archivos dentro de
.gitpara mantener la metadata del repositorio actualizada.
- ❌ No se tocan:
- Archivos modificados localmente por el usuario, incluso si también cambiaron en remoto.
- Archivos no gestionados por el script (sin registro en
.sync_state).
- ✅ Se actualizan automáticamente:
-
Notas de uso y seguridad:
- Asegúrate de que las URLs sean accesibles desde el contenedor (credenciales/SSH si aplica).
- Tu trabajo local está protegido: los cambios locales nunca se sobrescriben automáticamente.
- El archivo
.sync_stateregistra los archivos gestionados por el script y su última actualización, permitiendo un control preciso de qué archivos pueden actualizarse o eliminarse de forma segura.
El proyecto contiene tres Dockerfiles especializados, cada uno en su propio directorio. Aunque no son ramas de Git, representan tres configuraciones distintas que puedes modificar y construir localmente según tus necesidades.
git clone https://github.com/davidgb8246/Jupyter-um01
cd Jupyter-um01A continuación se muestra el ejemplo completo para la configuración sage-statistics (que incluye ambos entornos). Las otras configuraciones (sage y statistics) siguen el mismo proceso.
- Abre el archivo
sage-statistics/Dockerfilecon tu editor preferido:
# En Linux/macOS
nano sage-statistics/Dockerfile
# O en Windows
notepad sage-statistics\Dockerfile- Modifica el Dockerfile según necesites:
# Ejemplo: Agregar librerías adicionales al entorno SageMath
RUN conda install -n sage -c conda-forge \
sympy \
networkx \
otra-libreria-nueva
# Ejemplo: Agregar librerías adicionales al entorno de Estadística
RUN conda install -n statistics -c conda-forge \
scikit-learn \
xgboost \
otra-libreria-statsUna vez editado el Dockerfile, construye la imagen desde la raíz del proyecto, especificando la ruta al Dockerfile:
docker build \
-f sage-statistics/Dockerfile \
-t mi-jupyter-sage-statistics:v1.0 \
.Explicación del comando:
-f sage-statistics/Dockerfile: Especifica cuál Dockerfile construir (ruta relativa desde la raíz)-t mi-jupyter-sage-statistics:v1.0: Asigna un nombre y versión a la imagen.: Establece la raíz del proyecto como contexto de construcción (permite acceder a archivos compartidos)
docker run -d \
--rm \
-p 7777:8888 \
-e JUPYTER_PASSWD="your_secure_password" \
-e GIT_REPOS="https://github.com/usuario/repo" \
-v $(pwd)/mi_trabajo:/home/jupyter/work \
--name jupyter-personalizado \
mi-jupyter-sage-statistics:v1.0Para modificar la configuración sage o statistics, simplemente repite los pasos anteriores especificando el Dockerfile correcto:
# Para la configuración sage (solo SageMath)
docker build \
-f sage/Dockerfile \
-t mi-jupyter-sage:v1.0 \
.
# Para la configuración statistics (solo Estadística)
docker build \
-f statistics/Dockerfile \
-t mi-jupyter-statistics:v1.0 \
.Luego ejecuta cada una con su respectiva imagen:
# Ejecutar versión sage personalizada
docker run -d --rm -p 7777:8888 \
-v $(pwd)/mi_trabajo:/home/jupyter/work \
mi-jupyter-sage:v1.0
# Ejecutar versión statistics personalizada
docker run -d --rm -p 7777:8888 \
-v $(pwd)/mi_trabajo:/home/jupyter/work \
mi-jupyter-statistics:v1.0- Prueba cambios pequeños: Modifica y reconstruye un cambio por vez para identificar problemas rápidamente.
- Verifica la sintaxis del Dockerfile: Asegúrate de que sea correcta antes de construir (
docker build --no-cache ...reconstruye sin caché). - Limpia imágenes antiguas:
docker image prunepara liberar espacio. - Usa tags descriptivos: En lugar de
v1.0, usa nombres comosage-statistics-opencv-v1.0para identificar cambios específicos. - Inspecciona el contenedor en ejecución:
docker exec -it jupyter-personalizado bashpara acceder a la terminal del contenedor. - Ver logs de construcción: Si hay errores,
docker build --no-cache -f archivo/Dockerfile -t nombre .mostrará más detalles.
Este proyecto ha sido desarrollado y es mantenido por:
- David G.B. - davidgb8246