54 lines
1.6 KiB
Docker
54 lines
1.6 KiB
Docker
# Multi-stage Dockerfile for the Normogen frontend server.
|
|
#
|
|
# Stage 1: Build the Vite SPA bundle.
|
|
# Stage 2: Build the Axum frontend-server binary.
|
|
# Stage 3: Slim runtime with the binary + static files.
|
|
|
|
# ============================================================================
|
|
# Stage 1: Node — build the Vite SPA
|
|
# ============================================================================
|
|
FROM node:20-slim AS node-builder
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy package files and install deps.
|
|
COPY web/normogen-web/package.json web/normogen-web/package-lock.json ./
|
|
RUN npm ci
|
|
|
|
# Copy the source and build.
|
|
COPY web/normogen-web/ ./
|
|
RUN npm run build
|
|
|
|
# ============================================================================
|
|
# Stage 2: Rust — build the frontend-server binary
|
|
# ============================================================================
|
|
FROM rust:latest AS rust-builder
|
|
|
|
WORKDIR /server
|
|
|
|
# Copy the frontend-server crate.
|
|
COPY web/frontend-server/ ./
|
|
|
|
# Build release.
|
|
RUN cargo build --release
|
|
|
|
# ============================================================================
|
|
# Stage 3: Runtime — slim image with binary + static files
|
|
# ============================================================================
|
|
FROM debian:bookworm-slim
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy the frontend-server binary.
|
|
COPY --from=rust-builder /server/target/release/normogen-frontend-server /app/frontend-server
|
|
|
|
# Copy the built static files.
|
|
COPY --from=node-builder /app/dist /app/dist
|
|
|
|
EXPOSE 8080
|
|
|
|
CMD ["./frontend-server"]
|