# Stalwart Dockerfile # Credits: https://github.com/33KK FROM --platform=$BUILDPLATFORM docker.io/lukemathwalker/cargo-chef:latest-rust-slim-bookworm AS chef WORKDIR /build FROM --platform=$BUILDPLATFORM chef AS planner COPY . . RUN cargo chef prepare --recipe-path /recipe.json FROM --platform=$BUILDPLATFORM chef AS builder ARG TARGETPLATFORM RUN case "${TARGETPLATFORM}" in \ "linux/arm64") echo "aarch64-unknown-linux-gnu" > /target.txt && echo "-C linker=aarch64-linux-gnu-gcc" > /flags.txt ;; \ "linux/amd64") echo "x86_64-unknown-linux-gnu" > /target.txt && echo "-C linker=x86_64-linux-gnu-gcc" > /flags.txt ;; \ *) exit 1 ;; \ esac RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ apt-get install -yq build-essential libclang-16-dev \ g++-aarch64-linux-gnu binutils-aarch64-linux-gnu \ g++-x86-64-linux-gnu binutils-x86-64-linux-gnu RUN rustup target add "$(cat /target.txt)" COPY --from=planner /recipe.json /recipe.json RUN RUSTFLAGS="$(cat /flags.txt)" cargo chef cook --target "$(cat /target.txt)" --release --recipe-path /recipe.json COPY . . RUN RUSTFLAGS="$(cat /flags.txt)" cargo build --target "$(cat /target.txt)" --release -p mail-server -p stalwart-cli RUN mv "/build/target/$(cat /target.txt)/release" "/output" FROM docker.io/debian:bookworm-slim WORKDIR /opt/stalwart-mail RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ apt-get install -yq ca-certificates COPY --from=builder /output/stalwart-mail /usr/local/bin COPY --from=builder /output/stalwart-cli /usr/local/bin COPY ./resources/docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod -R 755 /usr/local/bin CMD ["/usr/local/bin/stalwart-mail"] VOLUME [ "/opt/stalwart-mail" ] EXPOSE 443 25 587 465 143 993 4190 8080 ENTRYPOINT ["/bin/sh", "/usr/local/bin/entrypoint.sh"]