# ── Stage 1: Builder ────────────────────────────────────────────────────────── # # Uses the official Rust image on Debian Bookworm. # capnproto is installed here because build.rs invokes `capnp` at compile time. FROM rust:bookworm AS builder RUN apt-get update \ && apt-get install -y --no-install-recommends capnproto \ && rm -rf /var/lib/apt/lists/* WORKDIR /build # Copy manifests first so dependency layers are cached independently of source. COPY Cargo.toml Cargo.lock ./ COPY crates/quicproquo-core/Cargo.toml crates/quicproquo-core/Cargo.toml COPY crates/quicproquo-proto/Cargo.toml crates/quicproquo-proto/Cargo.toml COPY crates/quicproquo-server/Cargo.toml crates/quicproquo-server/Cargo.toml COPY crates/quicproquo-client/Cargo.toml crates/quicproquo-client/Cargo.toml COPY crates/quicproquo-p2p/Cargo.toml crates/quicproquo-p2p/Cargo.toml # Create dummy source files so `cargo build` can resolve the dependency graph # and cache the compiled dependencies before copying real source. RUN mkdir -p \ crates/quicproquo-core/src \ crates/quicproquo-proto/src \ crates/quicproquo-server/src \ crates/quicproquo-client/src \ crates/quicproquo-p2p/src \ && echo 'fn main() {}' > crates/quicproquo-server/src/main.rs \ && echo 'fn main() {}' > crates/quicproquo-client/src/main.rs \ && touch crates/quicproquo-core/src/lib.rs \ && touch crates/quicproquo-proto/src/lib.rs \ && touch crates/quicproquo-p2p/src/lib.rs # Schemas must exist before the proto crate's build.rs runs. COPY schemas/ schemas/ # Build dependencies only (source stubs mean this layer is cache-friendly). # The GUI crate is not included, so workspace resolution may fail — || true handles it. RUN cargo build --release --bin qpq-server --bin qpq 2>/dev/null || true # Copy real source and build for real. COPY crates/ crates/ # Touch source to force re-compilation after copying real crates. RUN touch \ crates/quicproquo-core/src/lib.rs \ crates/quicproquo-proto/src/lib.rs \ crates/quicproquo-p2p/src/lib.rs \ crates/quicproquo-server/src/main.rs \ crates/quicproquo-client/src/main.rs RUN cargo build --release --bin qpq-server --bin qpq # ── Stage 2: Runtime ────────────────────────────────────────────────────────── # # Minimal Debian Bookworm image with both server and client binaries. FROM debian:bookworm-slim AS runtime RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /build/target/release/qpq-server /usr/local/bin/qpq-server COPY --from=builder /build/target/release/qpq /usr/local/bin/qpq RUN mkdir -p /chat EXPOSE 7000 ENV RUST_LOG=info