2026-06-15 00:06:57 +02:00
|
|
|
# Build/version info, injected via --build-arg (defaults keep un-built/dev runs working).
|
|
|
|
|
ARG APP_VERSION=dev
|
|
|
|
|
ARG GIT_SHA=unknown
|
|
|
|
|
ARG BUILD_DATE=
|
|
|
|
|
|
2026-06-11 02:19:47 +02:00
|
|
|
# Stage 1: build the frontend SPA
|
|
|
|
|
FROM node:20-alpine AS frontend
|
2026-06-15 00:06:57 +02:00
|
|
|
ARG APP_VERSION
|
|
|
|
|
ARG GIT_SHA
|
|
|
|
|
ARG BUILD_DATE
|
|
|
|
|
# Vite inlines VITE_*-prefixed env into the bundle at build time.
|
|
|
|
|
ENV VITE_APP_VERSION=$APP_VERSION VITE_GIT_SHA=$GIT_SHA VITE_BUILD_DATE=$BUILD_DATE
|
2026-06-11 02:19:47 +02:00
|
|
|
WORKDIR /fe
|
|
|
|
|
COPY frontend/package.json ./
|
|
|
|
|
RUN npm install
|
|
|
|
|
COPY frontend/ ./
|
|
|
|
|
RUN npm run build
|
|
|
|
|
|
|
|
|
|
# Stage 2: backend runtime, serving the built SPA
|
|
|
|
|
FROM python:3.12-slim
|
2026-06-15 00:06:57 +02:00
|
|
|
ARG APP_VERSION
|
|
|
|
|
ARG GIT_SHA
|
|
|
|
|
ARG BUILD_DATE
|
2026-06-11 02:19:47 +02:00
|
|
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
|
|
|
PYTHONUNBUFFERED=1 \
|
|
|
|
|
PIP_NO_CACHE_DIR=1 \
|
2026-06-15 00:06:57 +02:00
|
|
|
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
|
|
|
|
APP_VERSION=$APP_VERSION \
|
|
|
|
|
GIT_SHA=$GIT_SHA \
|
|
|
|
|
BUILD_DATE=$BUILD_DATE
|
2026-06-11 02:19:47 +02:00
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
COPY backend/requirements.txt .
|
2026-06-14 05:59:34 +02:00
|
|
|
RUN pip install --upgrade pip && pip install -r requirements.txt
|
2026-06-11 02:19:47 +02:00
|
|
|
|
|
|
|
|
COPY backend/ .
|
|
|
|
|
COPY --from=frontend /fe/dist ./app/static_spa
|
|
|
|
|
|
|
|
|
|
RUN adduser --disabled-password --gecos "" appuser && chown -R appuser /app
|
|
|
|
|
USER appuser
|
|
|
|
|
|
|
|
|
|
EXPOSE 8000
|
|
|
|
|
CMD ["sh", "entrypoint.sh"]
|