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"]