runeforge 25.8.0

Blueprint to optimal stack JSON converter - Part of Rune* Ecosystem
# === Multi-arch build for Runeforge ===
FROM --platform=$BUILDPLATFORM rust:1.80-alpine AS builder

ARG TARGETPLATFORM
ARG BUILDPLATFORM
ARG TARGETARCH

# Install build dependencies
RUN apk add --no-cache musl-dev openssl-dev pkgconfig

WORKDIR /app

# Setup cargo for cross-compilation
RUN case ${TARGETARCH} in \
    "amd64") RUST_TARGET="x86_64-unknown-linux-musl" ;; \
    "arm64") RUST_TARGET="aarch64-unknown-linux-musl" ;; \
    *) echo "Unsupported arch: ${TARGETARCH}" && exit 1 ;; \
    esac && \
    rustup target add ${RUST_TARGET}

# Copy manifests
COPY Cargo.toml Cargo.lock ./
COPY rust-toolchain.toml ./

# Copy source
COPY src/ ./src/
COPY schemas/ ./schemas/
COPY resources/ ./resources/

# Build for target architecture
RUN case ${TARGETARCH} in \
    "amd64") RUST_TARGET="x86_64-unknown-linux-musl" ;; \
    "arm64") RUST_TARGET="aarch64-unknown-linux-musl" ;; \
    esac && \
    cargo build --release --locked --target ${RUST_TARGET} && \
    cp target/${RUST_TARGET}/release/runeforge /app/runeforge

# === Runtime image ===
FROM alpine:3.19

WORKDIR /app

# Install runtime dependencies
RUN apk add --no-cache ca-certificates

# Copy binary from builder
COPY --from=builder /app/runeforge /usr/local/bin/runeforge

# Copy resources
COPY --from=builder /app/schemas/ ./schemas/
COPY --from=builder /app/resources/ ./resources/

# Create non-root user
RUN adduser -D -s /bin/sh runeforge
USER runeforge

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD runeforge --version || exit 1

# Default command
ENTRYPOINT ["runeforge"]
CMD ["--help"]

# Metadata
LABEL org.opencontainers.image.title="Runeforge"
LABEL org.opencontainers.image.description="Blueprint to optimal stack JSON converter"
LABEL org.opencontainers.image.source="https://github.com/rune-ecosystem/forge"
LABEL org.opencontainers.image.licenses="MIT"