# 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. # # This image ships two binaries: `prop-grid-rs` (default ENTRYPOINT, # drains grid_tasks) and `hrrr-point-worker` (k8s `command:` override, # drains hrrr_fetch_tasks). 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 across CI runs. # `target/` is deliberately NOT cached — after Stream C bumped the # crate to two binaries, the runner started running out of disk inside # the mount and the build would fail mid-link. Rebuilding from scratch # adds ~3 min to the build but removes the failure mode entirely. # Lint + test gate the image build so a regressed scorer or a clippy # warning never produces a pushable image. RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \ --mount=type=cache,target=/usr/local/cargo/git,sharing=locked \ rustup component add clippy \ && cargo clippy --all-targets -- -D warnings \ && cargo test --release \ && cargo build --release --bin worker --bin hrrr_point_worker \ && cp target/release/worker /usr/local/bin/worker \ && cp target/release/hrrr_point_worker /usr/local/bin/hrrr_point_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 COPY --from=builder /usr/local/bin/hrrr_point_worker /usr/local/bin/hrrr-point-worker USER 65534:65534 # Default entrypoint is the grid chain worker. Override with `command:` # in the k8s manifest (or `docker run ... hrrr-point-worker`) for the # per-QSO point worker. ENTRYPOINT ["/usr/bin/tini", "--"] CMD ["/usr/local/bin/prop-grid-rs"]