diff --git a/Dockerfile b/Dockerfile index ddd37f1d8..31c75303c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,81 @@ -ARG DEBIAN_DIST=bullseye +# syntax=docker/dockerfile:1.10 +# go to https://hub.docker.com/r/docker/dockerfile to see the latest version of the syntax -FROM rust:${DEBIAN_DIST} as builder +# Stage 1: Build the typos binary +FROM rust:1.81.0-slim-bookworm AS builder + +# Install musl-tools for static linking +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + liblz4-tool \ + musl-tools \ + xz-utils \ + && \ + rm -rf /var/lib/apt/lists/* + +# some targets were not used in the end because rust package is not working with them +# x86_64-pc-windows-msvc \ + +RUN rustup target add \ + aarch64-apple-darwin \ + aarch64-unknown-linux-musl \ + aarch64-unknown-linux-musl \ + x86_64-apple-darwin \ + x86_64-unknown-linux-musl \ + && : + +# Set the working directory WORKDIR /usr/src/typos + +# Copy the source code into the container COPY . . -RUN cargo install --path ./crates/typos-cli -FROM debian:${DEBIAN_DIST}-slim -COPY --from=builder /usr/local/cargo/bin/typos /usr/local/bin/typos -ENTRYPOINT ["typos"] -CMD ["--help"] +# Set build arguments +ARG TARGETPLATFORM +ARG BIN_NAME=typos + +# Determine the Rust target based on the platform +# fingers crossed this build will just work +# in case I need more platforms - https://github.com/containerd/containerd/blob/90cd777a6c8c92c105625ba086e2e67a0c32d7ed/platforms/platforms.go#L88-L94 +# elif [ "${TARGETPLATFORM}" = "windows/amd64" ]; then \ +# RUST_TARGET="x86_64-pc-windows-msvc"; \ +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/src/typos/target \ + set -xeEu \ + && \ + ARM_PLATFORMS='linux/arm/v6 linux/arm/v7 linux/arm64/v8 linux/arm64' \ + && \ + if [ "${TARGETPLATFORM}" = "darwin/arm64" ]; then \ + RUST_TARGET="aarch64-apple-darwin"; \ + elif printf '%s\n' ${ARM_PLATFORMS} | grep -Fxq "${TARGETPLATFORM}" ; then \ + RUST_TARGET="aarch64-unknown-linux-musl"; \ + elif [ "${TARGETPLATFORM}" = "darwin/amd64" ]; then \ + RUST_TARGET="x86_64-apple-darwin"; \ + elif [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \ + RUST_TARGET="x86_64-unknown-linux-musl"; \ + else \ + echo "Unsupported TARGETPLATFORM: ${TARGETPLATFORM}"; \ + exit 1; \ + fi \ + && \ + echo "Building for ${RUST_TARGET}" \ + && \ + cargo build \ + --release \ + --verbose \ + --target ${RUST_TARGET} \ + && \ + cp target/${RUST_TARGET}/release/${BIN_NAME} /usr/src/${BIN_NAME}/${BIN_NAME} + +# Stage 2: Create the final image +FROM scratch + +# Set build arguments +ARG BIN_NAME=typos + +# Copy the statically linked binary from the builder stage +COPY --from=builder /usr/src/typos/${BIN_NAME} /${BIN_NAME} + +# Set the entrypoint to the typos binary +WORKDIR /workdir +ENTRYPOINT ["/typos"] \ No newline at end of file