# syntax=docker/dockerfile:1
FROM rust:slim-bookworm AS builder
LABEL remote="silenloc/pear"
WORKDIR /app
# Keep the compiler/linker toolchain in the builder image only.
RUN apt-get update \
&& apt-get install -y --no-install-recommends mold \
&& rm -rf /var/lib/apt/lists/*
ENV RUSTFLAGS="-C link-arg=-fuse-ld=mold" \
CARGO_INCREMENTAL=0 \
CARGO_NET_RETRY=10 \
CARGO_TERM_COLOR=always
COPY Cargo.toml Cargo.lock ./
COPY assets ./assets
COPY src ./src
# BuildKit keeps the registry and target artifacts between builds.
RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \
--mount=type=cache,target=/app/target,sharing=locked \
cargo build --release \
&& cp target/release/pear /usr/local/bin/pear
FROM debian:bookworm-slim AS runtime
WORKDIR /app
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd --system pear \
&& useradd --system --gid pear --home-dir /app --no-create-home pear \
&& mkdir -p /storage \
&& chown pear:pear /storage
COPY --from=builder --chown=pear:pear /usr/local/bin/pear /app/pear
VOLUME ["/data"]
EXPOSE 80
USER pear
ENTRYPOINT ["./pear"]