ADR 0006 — Imagen única del contenedor: rocker/r-ver + scripts oficiales, Julia opcional por build-arg
- Estado: aceptado (medidas de tamaño y tiempo se registran en
docs/benchmarks/baseline.mdtras el primer build) - Fecha: 2026-10-16
Contexto
La especificación (Fase 0.6) exige una sola imagen, capas cacheables, sin herramientas que no usemos, con R fijado, arrow, DuckDB, sf/terra, targets, renv, Quarto, DVC, Python con uv, compilador C++ y Julia vía juliaup con depot precompilado, más puente JuliaCall. Debe medirse tamaño y tiempo de build.
Alternativas (verificado en Docker Hub el 2026-10-16)
| Base | Tamaño comprimido | Incluye | Veredicto |
|---|---|---|---|
rocker/r-ver:4.6.0 |
0.34 GB | R 4.6.0 compilado, Ubuntu 24.04 (noble), CRAN fijado a snapshot P3M 2026-06-23 con binarios, toolchain C/C++/Fortran, /rocker_scripts |
Elegida: mínima, reproducible por fecha, binarios rápidos |
rocker/geospatial:4.6.0 |
1.32 GB | Lo anterior + RStudio Server, TeX Live, tidyverse completo, GDAL/GEOS/PROJ y ~60 paquetes espaciales | Descartada: RStudio y TeX no se usan; viola “sin herramientas que no usemos” |
rocker/verse:4.6.0 |
1.33 GB | RStudio + TeX + tidyverse, sin geoespacial | Descartada por la misma razón y además faltan GDAL/GEOS |
Decisión
- Base
rocker/r-ver:4.6.0; librerías de sistema geoespaciales y gráficas víaapt(GDAL, GEOS, PROJ, udunits, cairo, harfbuzz…); Quarto 1.10.19 con el script oficialinstall_quarto.shde rocker. - Python:
uv0.13.1 copiado del contenedor oficialghcr.io/astral-sh/uv; Python 3.13 gestionado poruv;dvc[s3]3.67.1 como herramientauv tool; entorno del proyecto en/opt/uv/venvdesdeenv/python/pyproject.toml+uv.lock. - Julia:
juliaupcon canal fijado 1.13.2 en/opt/juliaup; depot precompilado en/opt/julia-depot(capa propia, cacheable); entorno/opt/env/juliacon DataFrames, Arrow, DuckDB, Distributions, Turing y RCall (requerido porJuliaCall). El depot del usuario (/home/ubuntu/.julia, volumen) se apila sobre el de la imagen. Controlado porARG WITH_JULIA(por defecto 1): si el benchmark del ítem 22 de la Fase 1 no justifica Julia, la imagen por defecto se construye conTQ_WITH_JULIA=0y este ADR se supersede. - R: paquetes en
env/r/packages.txt, instalados en la librería del sitio desde el snapshot P3M fijado;env/r/install_packages.Rrestauraenv/r/renv.lockcuando existe y siempre emiterenv.lock.generatedpara detectar deriva. No se activarenvpor proyecto (la librería vive en la imagen; evita el bind-mount lento en Windows). - Tres lockfiles versionados:
env/r/renv.lock,env/python/uv.lock,env/julia/Manifest.toml(+Project.toml). El primer build los genera; después, cada build los restaura y CI compara. - Usuario no root
ubuntu(uid 1000, creado explícitamente porque rocker/r-ver no trae el usuario por defecto de noble);docker/entrypoint.sharranca como root solo para dar permisos a los volúmenes nombrados y baja privilegios consetpriv. - Claude Code instalado en la imagen con el instalador nativo, versión fijada 2.1.301; configuración y login en el volumen
claude-home(unclaude loginla primera vez). - Límites de recursos:
.wslconfig(24 GB, 7 CPU) derivado demachine-profile.jsonfija el techo de la VM;start.sh/start.batleendocker infoy escriben.env(TQ_CPUS,TQ_MEM) paracompose.yaml. Nada hardcodeado; el host solo necesita Docker, Git, gh y Claude Code. - Volúmenes nombrados (fuera de NTFS):
dvc-cache(montado en/dvc-cache),targets-store,julia-user-depot,uv-cache,claude-home. El código es un bind-mount porque es pequeño y va en git. Corrección 2026-10-16:raw/ya no es volumen: sus archivos.dvcy manifiestos deben ser visibles para git en el host; los bytes se escriben una vez y la deduplicación rápida la hace la caché DVC en el volumen. Dónde vivenstandardized/,harmonized/ymarts/(I/O intensivo) se decide en la Fase 2 con el benchmark.
Consecuencias
- Build inicial largo (precompilar Turing domina); builds posteriores reutilizan capas. Métricas en
docs/benchmarks/baseline.md. - Toda la sesión a partir de la Fase 0.6 ejecuta comandos de pipeline con
docker compose run --rm pipeline <cmd>; la sesión interactiva “dentro” esstart.bat/start.sh. - Riesgo:
rocker/r-verfija el snapshot CRAN a 2026-06-23; paquetes publicados después no están disponibles sin cambiarENV CRAN(decisión explícita, con ADR).