From 0a9570ca32f9632a47fa170725e73911f62dd005 Mon Sep 17 00:00:00 2001 From: Diego Date: Thu, 19 Oct 2023 12:33:03 +0200 Subject: [PATCH 1/5] Add arm64 support --- hole-punching-tests/Dockerfile | 19 +++++++++---------- hole-punching-tests/build.sh | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 hole-punching-tests/build.sh diff --git a/hole-punching-tests/Dockerfile b/hole-punching-tests/Dockerfile index b07b1e03a10..84c07475d6d 100644 --- a/hole-punching-tests/Dockerfile +++ b/hole-punching-tests/Dockerfile @@ -1,18 +1,17 @@ # syntax=docker/dockerfile:1.5-labs -FROM rust:1.72.0 as builder -RUN rustup target add x86_64-unknown-linux-musl -RUN --mount=type=cache,target=/var/cache/apt apt-get update && apt-get install -y musl-dev musl-tools +FROM --platform=$BUILDPLATFORM rust:1.72.0 as builder -# Run with access to the target cache to speed up builds +ARG BUILDPLATFORM + +# Set the working directory WORKDIR /workspace -ADD . . -RUN --mount=type=cache,target=./target \ - --mount=type=cache,target=/usr/local/cargo/registry \ - cargo build --release --package hole-punching-tests --target x86_64-unknown-linux-musl -RUN --mount=type=cache,target=./target \ - mv ./target/x86_64-unknown-linux-musl/release/hole-punching-tests /usr/local/bin/hole-punching-tests +# Copy the Rust project source code, including build.sh, into the image +COPY . /workspace + +# Make the build.sh script executable and run it +RUN chmod +x /workspace/build.sh && /workspace/build.sh ${BUILDPLATFORM} FROM alpine:3 COPY --from=builder /usr/local/bin/hole-punching-tests /usr/bin/hole-punch-client diff --git a/hole-punching-tests/build.sh b/hole-punching-tests/build.sh new file mode 100644 index 00000000000..2ae4863aa91 --- /dev/null +++ b/hole-punching-tests/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Translate Docker platform format to Rust target format +case "$(echo $1 | cut -d/ -f2)" in + "amd64") RUST_TARGET="x86_64-unknown-linux-musl";; + "arm64") RUST_TARGET="aarch64-unknown-linux-musl";; + *) echo "Unsupported architecture: $1" >&2; exit 1;; +esac + +# Add the Rust target +rustup target add ${RUST_TARGET} + +apt-get update && apt-get install -y musl-dev musl-tools + +# Build the project +cargo build --release --package hole-punching-tests --target ${RUST_TARGET} + +# Move the built binary to a common location +mv ./target/${RUST_TARGET}/release/hole-punching-tests /usr/local/bin/hole-punching-tests From 772af29048f3589308b3831bc033a0e38ee7b810 Mon Sep 17 00:00:00 2001 From: Diego Date: Thu, 19 Oct 2023 15:14:27 +0200 Subject: [PATCH 2/5] Small fix in Dockerfile --- hole-punching-tests/Dockerfile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/hole-punching-tests/Dockerfile b/hole-punching-tests/Dockerfile index 84c07475d6d..b02dbc1036d 100644 --- a/hole-punching-tests/Dockerfile +++ b/hole-punching-tests/Dockerfile @@ -4,14 +4,10 @@ FROM --platform=$BUILDPLATFORM rust:1.72.0 as builder ARG BUILDPLATFORM -# Set the working directory WORKDIR /workspace - -# Copy the Rust project source code, including build.sh, into the image COPY . /workspace - -# Make the build.sh script executable and run it -RUN chmod +x /workspace/build.sh && /workspace/build.sh ${BUILDPLATFORM} +COPY /build.sh /build.sh +RUN chmod +x /build.sh && /build.sh ${BUILDPLATFORM} FROM alpine:3 COPY --from=builder /usr/local/bin/hole-punching-tests /usr/bin/hole-punch-client From 6c0eb708f8541f976e5811fc751b74e629e4714b Mon Sep 17 00:00:00 2001 From: Diego Date: Sun, 22 Oct 2023 18:42:10 +0200 Subject: [PATCH 3/5] Remove hardcoded architecture --- hole-punching-tests/Dockerfile | 17 +++++++++-------- hole-punching-tests/build.sh | 19 ------------------- 2 files changed, 9 insertions(+), 27 deletions(-) delete mode 100644 hole-punching-tests/build.sh diff --git a/hole-punching-tests/Dockerfile b/hole-punching-tests/Dockerfile index b02dbc1036d..59d5ac5f554 100644 --- a/hole-punching-tests/Dockerfile +++ b/hole-punching-tests/Dockerfile @@ -1,16 +1,17 @@ # syntax=docker/dockerfile:1.5-labs +FROM rust:1.72.0 as builder -FROM --platform=$BUILDPLATFORM rust:1.72.0 as builder - -ARG BUILDPLATFORM +RUN --mount=type=cache,target=/var/cache/apt apt-get update && apt-get install -y musl-dev musl-tools +# Run with access to the target cache to speed up builds WORKDIR /workspace -COPY . /workspace -COPY /build.sh /build.sh -RUN chmod +x /build.sh && /build.sh ${BUILDPLATFORM} +ADD . . +RUN --mount=type=cache,target=./target \ + --mount=type=cache,target=/usr/local/cargo/registry \ + cargo build --release --package hole-punching-tests && \ + mv ./target/release/hole-punching-tests /usr/local/bin/hole-punching-tests FROM alpine:3 COPY --from=builder /usr/local/bin/hole-punching-tests /usr/bin/hole-punch-client -RUN --mount=type=cache,target=/var/cache/apk apk add bind-tools jq curl tcpdump iproute2-tc - +RUN --mount=type=cache,target=/var/cache/apk apk add bind-tools jq curl tcpdump ENV RUST_BACKTRACE=1 diff --git a/hole-punching-tests/build.sh b/hole-punching-tests/build.sh deleted file mode 100644 index 2ae4863aa91..00000000000 --- a/hole-punching-tests/build.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Translate Docker platform format to Rust target format -case "$(echo $1 | cut -d/ -f2)" in - "amd64") RUST_TARGET="x86_64-unknown-linux-musl";; - "arm64") RUST_TARGET="aarch64-unknown-linux-musl";; - *) echo "Unsupported architecture: $1" >&2; exit 1;; -esac - -# Add the Rust target -rustup target add ${RUST_TARGET} - -apt-get update && apt-get install -y musl-dev musl-tools - -# Build the project -cargo build --release --package hole-punching-tests --target ${RUST_TARGET} - -# Move the built binary to a common location -mv ./target/${RUST_TARGET}/release/hole-punching-tests /usr/local/bin/hole-punching-tests From b6f763c728cfe729e305552c5d4e0933154aa16d Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 23 Oct 2023 23:57:28 +0200 Subject: [PATCH 4/5] Detect arch in a script and target linux-musl --- hole-punching-tests/Dockerfile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hole-punching-tests/Dockerfile b/hole-punching-tests/Dockerfile index 59d5ac5f554..67662b3fb38 100644 --- a/hole-punching-tests/Dockerfile +++ b/hole-punching-tests/Dockerfile @@ -1,6 +1,10 @@ # syntax=docker/dockerfile:1.5-labs FROM rust:1.72.0 as builder +ARG RUST_TARGET + +RUN rustup target add $RUST_TARGET + RUN --mount=type=cache,target=/var/cache/apt apt-get update && apt-get install -y musl-dev musl-tools # Run with access to the target cache to speed up builds @@ -8,8 +12,10 @@ WORKDIR /workspace ADD . . RUN --mount=type=cache,target=./target \ --mount=type=cache,target=/usr/local/cargo/registry \ - cargo build --release --package hole-punching-tests && \ - mv ./target/release/hole-punching-tests /usr/local/bin/hole-punching-tests + cargo build --release --package hole-punching-tests --target $RUST_TARGET + +RUN --mount=type=cache,target=./target \ + mv ./target/$RUST_TARGET/release/hole-punching-tests /usr/local/bin/hole-punching-tests FROM alpine:3 COPY --from=builder /usr/local/bin/hole-punching-tests /usr/bin/hole-punch-client From c945f8d2c7fde1d4e55dbca701694492f51356e3 Mon Sep 17 00:00:00 2001 From: Diego Date: Tue, 24 Oct 2023 11:47:11 +0200 Subject: [PATCH 5/5] Statically link on default target --- hole-punching-tests/Dockerfile | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/hole-punching-tests/Dockerfile b/hole-punching-tests/Dockerfile index 67662b3fb38..20524c79889 100644 --- a/hole-punching-tests/Dockerfile +++ b/hole-punching-tests/Dockerfile @@ -1,23 +1,19 @@ # syntax=docker/dockerfile:1.5-labs FROM rust:1.72.0 as builder -ARG RUST_TARGET - -RUN rustup target add $RUST_TARGET - -RUN --mount=type=cache,target=/var/cache/apt apt-get update && apt-get install -y musl-dev musl-tools - # Run with access to the target cache to speed up builds WORKDIR /workspace ADD . . + +# Build the relay as a statically-linked binary. Unfortunately, we must specify the `--target` explicitly. See https://msfjarvis.dev/posts/building-static-rust-binaries-for-linux/. RUN --mount=type=cache,target=./target \ --mount=type=cache,target=/usr/local/cargo/registry \ - cargo build --release --package hole-punching-tests --target $RUST_TARGET + RUSTFLAGS='-C target-feature=+crt-static' cargo build --release --package hole-punching-tests --target $(rustc -vV | grep host | awk '{print $2}') RUN --mount=type=cache,target=./target \ - mv ./target/$RUST_TARGET/release/hole-punching-tests /usr/local/bin/hole-punching-tests + mv ./target/$(rustc -vV | grep host | awk '{print $2}')/release/hole-punching-tests /usr/local/bin/hole-punching-tests FROM alpine:3 COPY --from=builder /usr/local/bin/hole-punching-tests /usr/bin/hole-punch-client -RUN --mount=type=cache,target=/var/cache/apk apk add bind-tools jq curl tcpdump +RUN --mount=type=cache,target=/var/cache/apk apk add bind-tools jq curl tcpdump iproute2-tc ENV RUST_BACKTRACE=1