FROM rust:slim AS chef RUN cargo install cargo-chef WORKDIR /app #################################################################################################### ## Planner #################################################################################################### FROM chef AS planner WORKDIR /app COPY ./Cargo.lock ./ COPY ./Cargo.toml ./ COPY ./src ./src RUN cargo chef prepare --recipe-path recipe.json #################################################################################################### ## Builder #################################################################################################### FROM chef AS builder RUN rustup target add x86_64-unknown-linux-musl RUN apt update && apt install -y musl-tools musl-dev RUN update-ca-certificates # Create appuser ENV USER=website ENV UID=10001 RUN adduser \ --disabled-password \ --gecos "" \ --home "/nonexistent" \ --shell "/sbin/nologin" \ --no-create-home \ --uid "${UID}" \ "${USER}" WORKDIR /app COPY --from=planner /app/recipe.json ./ RUN cargo chef cook --target x86_64-unknown-linux-musl --release --recipe-path recipe.json COPY ./Cargo.lock ./ COPY ./Cargo.toml ./ COPY ./src ./src RUN cargo build --target x86_64-unknown-linux-musl --release #################################################################################################### ## Final image #################################################################################################### FROM scratch # Import from builder. COPY --from=builder /etc/passwd /etc/passwd COPY --from=builder /etc/group /etc/group WORKDIR /app # Copy our build COPY --from=builder /app/target/x86_64-unknown-linux-musl/release/website ./ COPY ./static ./static COPY ./templates ./templates COPY ./pages ./pages COPY ./config.toml ./config.toml EXPOSE 8080 # Use an unprivileged user. USER website:website ENV RUST_LOG="debug" ENTRYPOINT ["/app/website"]