openworkers-cli 0.2.4

CLI for OpenWorkers - Self-hosted Cloudflare Workers runtime
FROM debian:bookworm-slim AS common

RUN apt-get update \
    && apt-get install -y ca-certificates \
    && rm -rf /var/lib/apt/lists/*

FROM --platform=$BUILDPLATFORM rust:1.91-bookworm AS prepare

RUN apt-get update && apt-get install -y \
    gcc-aarch64-linux-gnu \
    gcc-x86-64-linux-gnu \
    libc6-dev-amd64-cross \
    libc6-dev-arm64-cross

ENV CC_x86_64_unknown_linux_gnu=x86_64-linux-gnu-gcc
ENV CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc

ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-linux-gnu-gcc
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc

RUN rustup target add x86_64-unknown-linux-gnu \
                      aarch64-unknown-linux-gnu

RUN cargo install cargo-chef

FROM prepare AS planner

WORKDIR /build
COPY . .
RUN cargo chef prepare --recipe-path recipe.json

FROM prepare AS platform

ARG TARGETPLATFORM

WORKDIR /build

COPY --from=planner /build/recipe.json recipe.json

RUN echo "Building for $TARGETPLATFORM"

# Build dependencies for target platform
RUN --mount=type=cache,id=cargo-cli-$TARGETPLATFORM,sharing=locked,target=$CARGO_HOME/git \
    --mount=type=cache,id=cargo-cli-$TARGETPLATFORM,sharing=locked,target=$CARGO_HOME/registry \
    --mount=type=cache,id=cargo-cli-$TARGETPLATFORM,sharing=locked,target=/build/target \
    case "$TARGETPLATFORM" in \
        "linux/arm64") cargo chef cook --release --target aarch64-unknown-linux-gnu --recipe-path recipe.json ;; \
        "linux/amd64") cargo chef cook --release --target x86_64-unknown-linux-gnu --recipe-path recipe.json ;; \
        *) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \
    esac

COPY . /build

# Build CLI for target platform
RUN --mount=type=cache,id=cargo-cli-$TARGETPLATFORM,sharing=locked,target=$CARGO_HOME/git \
    --mount=type=cache,id=cargo-cli-$TARGETPLATFORM,sharing=locked,target=$CARGO_HOME/registry \
    --mount=type=cache,id=cargo-cli-$TARGETPLATFORM,sharing=locked,target=/build/target \
    case "$TARGETPLATFORM" in \
        "linux/arm64") \
            cargo build --release --target aarch64-unknown-linux-gnu && \
            mv /build/target/aarch64-unknown-linux-gnu/release/ow /build/output ;; \
        "linux/amd64") \
            cargo build --release --target x86_64-unknown-linux-gnu && \
            mv /build/target/x86_64-unknown-linux-gnu/release/ow /build/output ;; \
        *) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \
    esac

FROM common

COPY --from=platform /build/output /usr/local/bin/ow

ENTRYPOINT ["/usr/local/bin/ow"]