53 lines
1.8 KiB
Docker
53 lines
1.8 KiB
Docker
# syntax=docker/dockerfile:1.6
|
||
# ---- Build stage (Debian, plus robuste que alpine pour npm)
|
||
FROM node:22-bookworm-slim AS build
|
||
WORKDIR /app
|
||
|
||
# NPM moins bavard + moins de trucs qui cassent en CI
|
||
ENV npm_config_update_notifier=false \
|
||
npm_config_audit=false \
|
||
npm_config_fund=false \
|
||
npm_config_progress=false
|
||
|
||
# (Optionnel mais propre) git + certificats
|
||
RUN apt-get -o Acquire::Retries=5 -o Acquire::ForceIPv4=true update \
|
||
&& apt-get install -y --no-install-recommends ca-certificates git \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Déps d’abord (cache Docker)
|
||
COPY package.json package-lock.json ./
|
||
RUN npm ci --no-audit --no-fund
|
||
|
||
# Sources
|
||
COPY . .
|
||
|
||
# Variables publiques injectées au build (import.meta.env.PUBLIC_*)
|
||
ARG PUBLIC_GITEA_BASE
|
||
ARG PUBLIC_GITEA_OWNER
|
||
ARG PUBLIC_GITEA_REPO
|
||
|
||
# ✅ Canonical + sitemap base (astro.config.mjs lit process.env.PUBLIC_SITE)
|
||
ARG PUBLIC_SITE
|
||
|
||
# ✅ Garde-fou : si 1 → build fail si PUBLIC_SITE absent
|
||
ARG REQUIRE_PUBLIC_SITE=0
|
||
|
||
ENV PUBLIC_GITEA_BASE=$PUBLIC_GITEA_BASE \
|
||
PUBLIC_GITEA_OWNER=$PUBLIC_GITEA_OWNER \
|
||
PUBLIC_GITEA_REPO=$PUBLIC_GITEA_REPO \
|
||
PUBLIC_SITE=$PUBLIC_SITE \
|
||
REQUIRE_PUBLIC_SITE=$REQUIRE_PUBLIC_SITE
|
||
|
||
# ✅ antifragile : refuse de builder sans PUBLIC_SITE quand on l’exige
|
||
RUN node -e "if (process.env.REQUIRE_PUBLIC_SITE==='1' && !process.env.PUBLIC_SITE) { console.error('FATAL: PUBLIC_SITE is required (canonical/sitemap).'); process.exit(1) }"
|
||
|
||
# Build Astro (postbuild tourne via npm scripts)
|
||
RUN npm run build
|
||
|
||
# ---- Runtime stage (nginx)
|
||
FROM nginx:1.27-alpine AS runtime
|
||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||
COPY --from=build /app/dist/ /usr/share/nginx/html/
|
||
RUN find /usr/share/nginx/html -type d -exec chmod 755 {} \; \
|
||
&& find /usr/share/nginx/html -type f -exec chmod 644 {} \;
|
||
EXPOSE 80 |