# Basado en el Dockerfile real de docs-portal (sitio MkDocs Material). # Mejora respecto al original: nginx corre como usuario NO-root acá # (nginxinc/nginx-unprivileged) -- el docs-portal real del lab todavía # corre nginx:1.27-alpine estándar (como root), un gap real encontrado # al armar este template, pendiente de aplicar al repo real por # separado. # # Este template asume MkDocs -- es el único generador de sitio estático # que existe hoy en el lab. Si tu app usa otro generador (Hugo, Astro, # un build de Vite sin backend), el STAGE 1 es lo único que cambia: # reemplazalo por el build real de tu herramienta, el STAGE 2 # (nginx no-root) sirve igual para cualquier sitio 100% estático. # # ARGs: # PYTHON_IMAGE -- versión del builder (solo aplica al ejemplo MkDocs). # NGINX_IMAGE -- versión de nginx no-root. # APP_PORT -- OJO: esto solo cambia el EXPOSE/healthcheck de este # Dockerfile, NO el puerto real en el que nginx # escucha -- eso lo define el nginx.conf que trae la # propia imagen nginx-unprivileged, fijo en 8080. Si # cambiás este ARG a otro valor, tenés que agregar un # nginx.conf propio (COPY) que escuche en ese mismo # puerto, o quedan desalineados. Dejalo en 8080 # mientras no necesites tocar nginx.conf. # syntax=docker/dockerfile:1.7 ARG PYTHON_IMAGE=python:3.12-slim ARG NGINX_IMAGE=nginxinc/nginx-unprivileged:1.27-alpine ARG APP_PORT=8080 # --- Stage 1: build del sitio estático (ejemplo: MkDocs Material) --- FROM ${PYTHON_IMAGE} AS build WORKDIR /site COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY mkdocs.yml . COPY docs/ docs/ # --strict: cualquier link roto o warning de nav rompe el build, para # no publicar nunca un sitio con referencias muertas. Si tu generador # no tiene un equivalente a --strict, considerá agregar un paso de # validación de links aparte (ej. linkinator) antes de este build. RUN mkdocs build --strict # --- Stage 2: sirve el sitio estático con nginx, sin root --- FROM ${NGINX_IMAGE} ARG APP_PORT # ARG no alcanza para el HEALTHCHECK -- ese CMD corre en runtime, no en # build time, y ahí un ARG ya no existe. Hace falta ENV. ENV APP_PORT=${APP_PORT} # CAMBIAR "/site/site" al directorio real de salida de tu build si no # usás MkDocs (ej. "dist/", "public/", "build/", ".output/public/"). COPY --from=build /site/site /usr/share/nginx/html EXPOSE ${APP_PORT} # nginx-unprivileged trae wget (busybox) -- alcanza para un healthcheck # simple sin instalar nada más. HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD wget -q -O /dev/null "http://127.0.0.1:${APP_PORT}/" || exit 1