# ThreatFlux Rust Dockerfile
# Multi-stage build for single-crate or workspace-based applications.
FROM rust:1.99.0-bookworm@sha256:59037199c44290f2befcdd58dcc540164763fc296950255aaefeef096a1866b0 AS rust-base
ARG CARGO_BUILD_JOBS=2
ENV CARGO_BUILD_JOBS=${CARGO_BUILD_JOBS}
ARG VERSION=0.0.0
ARG BUILD_DATE=unknown
ARG VCS_REF=unknown
ARG BINARY_NAME=github-actions-maintainer
ARG BINARY_PACKAGE=
ARG SBOM_MANIFEST_PATH=Cargo.toml
ARG OCI_IMAGE_TITLE=Rust Application
ARG OCI_IMAGE_DESCRIPTION=Rust Application
ARG OCI_IMAGE_VENDOR=
ARG OCI_IMAGE_SOURCE=https://github.com
RUN apt-get update && apt-get install -y \
ca-certificates \
pkg-config \
libssl-dev \
&& rm -rf /var/lib/apt/lists/*
FROM rust-base AS builder
RUN if ! id -u builder >/dev/null 2>&1; then \
groupadd -f builder && useradd -m -o -u 1000 -g builder builder; \
fi
USER builder
WORKDIR /build
COPY --chown=builder:builder . .
RUN rustc --version --verbose && cargo --version && \
if [ -n "${BINARY_PACKAGE}" ]; then \
cargo build --locked --release -p "${BINARY_PACKAGE}" --bin "${BINARY_NAME}" --all-features; \
else \
cargo build --locked --release --bin "${BINARY_NAME}" --all-features; \
fi
RUN cargo install cargo-cyclonedx --locked --version 0.5.9 && \
cargo cyclonedx \
--manifest-path "${SBOM_MANIFEST_PATH}" \
--all-features \
--format json \
--spec-version 1.5 \
--override-filename "${BINARY_NAME}-sbom"
FROM debian:bookworm-slim@sha256:3783cc01769c7b2b1b83a5c5ad96c815348e28ed7da68e2e3687004faa906251 AS runtime
ARG VERSION=0.0.0
ARG BUILD_DATE=unknown
ARG VCS_REF=unknown
ARG BINARY_NAME=github-actions-maintainer
ARG OCI_IMAGE_TITLE=Rust Application
ARG OCI_IMAGE_DESCRIPTION=Rust Application
ARG OCI_IMAGE_VENDOR=
ARG OCI_IMAGE_SOURCE=https://github.com
LABEL org.opencontainers.image.title="${OCI_IMAGE_TITLE}" \
org.opencontainers.image.description="${OCI_IMAGE_DESCRIPTION}" \
org.opencontainers.image.version="${VERSION}" \
org.opencontainers.image.created="${BUILD_DATE}" \
org.opencontainers.image.revision="${VCS_REF}" \
org.opencontainers.image.vendor="${OCI_IMAGE_VENDOR}" \
org.opencontainers.image.source="${OCI_IMAGE_SOURCE}"
RUN apt-get update && apt-get install -y \
ca-certificates \
libssl3 \
tini \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /usr/share/doc/app \
&& useradd -m -u 1000 app
COPY --from=builder /build/target/release/${BINARY_NAME} /usr/local/bin/app
COPY --from=builder /build/${BINARY_NAME}-sbom.json /usr/share/doc/app/sbom.cdx.json
RUN chown -R app:app /usr/local/bin/app /usr/share/doc/app
USER app
WORKDIR /home/app
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/app"]
CMD []