53 lines
1.7 KiB
Docker
53 lines
1.7 KiB
Docker
# ─── Stage 1: Builder ────────────────────────────────────────────────────────
|
||
FROM rust:1.96 AS builder
|
||
|
||
WORKDIR /app
|
||
|
||
# System deps needed to compile OpenSSL and link the binary
|
||
RUN apt-get update && apt-get install -y \
|
||
pkg-config \
|
||
libssl-dev \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Add the WASM compilation target required by cargo-leptos
|
||
RUN rustup target add wasm32-unknown-unknown
|
||
|
||
# Install cargo-leptos (pinned for reproducibility).
|
||
# Done BEFORE copying source so this expensive step is cached
|
||
# as a separate layer and only re-runs when the Dockerfile changes.
|
||
RUN cargo install cargo-leptos --locked
|
||
|
||
# Copy the full source tree (respects .dockerignore).
|
||
# Everything above this line is layer-cached by Docker / the CI cache.
|
||
COPY . .
|
||
|
||
# Build server binary + WASM/CSS/JS site bundle in release mode
|
||
RUN cargo leptos build --release
|
||
|
||
# ─── Stage 2: Runtime ────────────────────────────────────────────────────────
|
||
FROM debian:bookworm-slim AS runtime
|
||
|
||
WORKDIR /app
|
||
|
||
RUN apt-get update && apt-get install -y \
|
||
ca-certificates \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Server binary
|
||
COPY --from=builder /app/target/release/toollist ./toollist
|
||
|
||
# JS / WASM / CSS site bundle (default site-root = "target/site")
|
||
COPY --from=builder /app/target/site ./target/site
|
||
|
||
# Cargo.toml is read at startup by leptos get_configuration()
|
||
COPY --from=builder /app/Cargo.toml ./Cargo.toml
|
||
|
||
# Seed data – in production this directory is mounted as a volume
|
||
COPY --from=builder /app/data ./data
|
||
|
||
EXPOSE 3000
|
||
|
||
ENV LEPTOS_ENV=PROD
|
||
|
||
CMD ["./toollist"]
|