# syntax=docker/dockerfile:1 # Image statique : build npm (VitePress + Slidev) puis nginx non-root. FROM node:22-bookworm-slim AS builder WORKDIR /app COPY package.json package-lock.json ./ # npm 10 (image officielle) et npm 11 (lock généré localement) divergent sur la validation du lock ; `install` reste déterministe via package-lock. RUN npm install COPY . . RUN npm run build # Même arborescence que tools/static-preview.mjs : portail à la racine, decks sous slides// RUN set -eux \ && mkdir -p /opt/site \ && cp -a dist-portal/. /opt/site/ \ && for d in dist-*; do \ [ -d "$d" ] || continue; \ [ "$d" = "dist-portal" ] && continue; \ slug="${d#dist-}"; \ mkdir -p "/opt/site/slides/${slug}"; \ cp -a "${d}/." "/opt/site/slides/${slug}/"; \ done FROM nginxinc/nginx-unprivileged:stable-alpine ARG UID=101 ARG GID=101 USER root COPY --from=builder /opt/site /usr/share/nginx/html COPY server/nginx/default.conf /etc/nginx/conf.d/default.conf RUN chown -R "${UID}:${GID}" /usr/share/nginx/html USER ${UID} EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"]