Skip to content
# 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"]