# planner: produce recipe.json FROM rust:1.89-slim AS planner WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends pkg-config libssl-dev ca-certificates postgresql-client curl && rm -rf /var/lib/apt/lists/* RUN cargo install --locked cargo-chef COPY . . RUN cargo chef prepare --recipe-path recipe.json # deps: compile only external crates FROM rust:1.89-slim AS deps WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends pkg-config libssl-dev ca-certificates postgresql-client curl && rm -rf /var/lib/apt/lists/* RUN cargo install --locked cargo-chef ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json # builder: compile local workspace crates using cached deps FROM rust:1.89-slim AS builder WORKDIR /app COPY --from=deps /usr/local/cargo /usr/local/cargo COPY --from=deps /usr/local/rustup /usr/local/rustup COPY --from=deps /app/target /app/target COPY . . RUN cargo build --release --locked # runtime: minimal test environment FROM rust:1.89-slim AS runtime RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client curl && rm -rf /var/lib/apt/lists/* WORKDIR /workspace/backend CMD ["sleep", "infinity"]