# Entorno del curso de Bases de Datos: PostgreSQL 18 (servidor y psql) +
# Node.js 26 (LTS) con el driver pg, todo en una sola imagen.
# Imagen nativa (amd64 o arm64): funciona igual en Linux, Windows (WSL2) y
# macOS, incluido Apple Silicon, sin emulación del contenedor.
FROM node:26-trixie-slim AS node

FROM postgres:18-trixie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends \
        libatomic1 libstdc++6 make git ca-certificates curl vim nano less tree man-db procps \
    && rm -rf /var/lib/apt/lists/*

# Node.js 26 tomado de la imagen oficial (mismo Debian, misma arquitectura;
# libatomic1 y libstdc++6, arriba, son las bibliotecas que necesita).
COPY --from=node /usr/local/bin/node /usr/local/bin/node
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
RUN ln -s ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -s ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \
    && node --version && npm --version

# El driver pg queda dentro de la imagen, en /node_modules: Node busca los
# paquetes subiendo de carpeta en carpeta hasta la raíz, así que
# `import pg from 'pg'` funciona en cualquier carpeta de /work sin npm install.
ARG PG_DRIVER_VERSION=8.23.1
RUN mkdir -p /opt/course && cd /opt/course \
    && npm init -y >/dev/null \
    && npm install --omit=dev --no-audit --no-fund pg@${PG_DRIVER_VERSION} \
    && ln -s /opt/course/node_modules /node_modules \
    && npm cache clean --force

# Servidor local, solo accesible desde dentro del contenedor (socket Unix):
# psql y pg se conectan sin contraseña como el usuario postgres.
ENV POSTGRES_HOST_AUTH_METHOD=trust \
    PGHOST=/var/run/postgresql \
    PGUSER=postgres \
    PGDATABASE=postgres

# En Linux y WSL2 los repositorios montados pertenecen a otro usuario; sin esto,
# git (que corre como root) los rechaza por "dubious ownership".
RUN git config --system --add safe.directory '*'

# El contexto de construcción es la raíz del repositorio (ver run.sh y
# .dockerignore): así la imagen trae los datos de ejemplo de Chasqui, que se
# cargan con chasqui-load desde cualquier carpeta.
COPY env/course-entrypoint.sh env/db-start env/db-stop env/db-crash env/chasqui-load /usr/local/bin/
COPY datasets/chasqui /opt/chasqui

WORKDIR /work
ENTRYPOINT ["course-entrypoint.sh"]
CMD ["bash"]
