# syntax=docker/dockerfile:1.7
#
# Multi-arch build for `prop-grid-rs`. wgrib2 isn't in Debian apt — the
# Elixir image builds it from source in its own stage. Rather than
# rebuild it here (~5 min per CI run), copy the binary + libg2c out of
# the already-published Elixir image.
#
# Runtime uid 65534 matches the fsGroup on the NFS scores mount.
ARG WGRIB2_IMAGE=git.mcintire.me/graham/prop:latest

FROM ${WGRIB2_IMAGE} AS wgrib2-src

FROM rust:1.94-trixie AS builder
WORKDIR /src

# Cache deps: copy manifests first so dependency changes alone don't
# invalidate the source-layer cache.
COPY Cargo.toml Cargo.lock* ./
COPY src ./src
COPY tests ./tests

# BuildKit cache mounts persist cargo's registry + git + target
# directories across CI runs, so dependency changes are the only
# thing that triggers a full rebuild. Lint + test gate the image
# build — a regressed scorer or a clippy warning never produces a
# pushable image. `target/` is cached but the final binary is
# copied out into a non-cached path so the runtime stage can reach
# it (COPY --from= can't read from a cache mount).
RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \
    --mount=type=cache,target=/usr/local/cargo/git,sharing=locked \
    --mount=type=cache,target=/src/target,sharing=locked \
    rustup component add clippy \
 && cargo clippy --all-targets -- -D warnings \
 && cargo test --release \
 && cargo build --release --bin worker \
 && cp target/release/worker /usr/local/bin/worker

# Runtime image: slim debian + the shared libs wgrib2 links against.
# libgfortran5/libaec0/zlib1g/libpng16-16t64/libopenjp2-7 mirror the
# Elixir runtime stage.
FROM debian:trixie-slim AS runtime
RUN apt-get update && apt-get install -y --no-install-recommends \
      ca-certificates \
      tini \
      libgfortran5 \
      libaec0 \
      zlib1g \
      libpng16-16t64 \
      libopenjp2-7 \
 && rm -rf /var/lib/apt/lists/*

COPY --from=wgrib2-src /usr/local/bin/wgrib2 /usr/local/bin/wgrib2
COPY --from=wgrib2-src /usr/local/lib/libg2c.so* /usr/local/lib/
RUN ldconfig

COPY --from=builder /usr/local/bin/worker /usr/local/bin/prop-grid-rs

USER 65534:65534
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/prop-grid-rs"]
