Files
platform-templates/dockerfiles/static-nginx.Dockerfile
T

67 lines
2.7 KiB
Docker

# 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