# === 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"