From a066a3ee3f5042a910b5200f851f25bc5ed07fc3 Mon Sep 17 00:00:00 2001 From: Stephen Kitt Date: Wed, 11 Dec 2024 08:42:28 +0100 Subject: [PATCH] Switch to Fedora for nettest and use packaged netperf netperf currently fails to build with the latest Alpine images, even with _GNU_SOURCE fixes. To allow building the nettest image again, this switches to Fedora, where netperf is available as a package (so we don't need to deal with building it). The image size is more than doubled, from 24.2MiB with Alpine to 59.8MiB with Fedora. This ends up with nmap ncat rather than busybox ncat, so the nettest scripts are adjusted to suit. Signed-off-by: Stephen Kitt --- package/Dockerfile.nettest | 34 ++++++------------- scripts/nettest/metricsproxy | 2 +- scripts/nettest/simpleserver | 2 +- scripts/shared/dnf_install | 66 ++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 25 deletions(-) create mode 100755 scripts/shared/dnf_install diff --git a/package/Dockerfile.nettest b/package/Dockerfile.nettest index eedb72048..7f5cf57e2 100644 --- a/package/Dockerfile.nettest +++ b/package/Dockerfile.nettest @@ -1,32 +1,20 @@ -FROM alpine +ARG FEDORA_VERSION=41 -WORKDIR /app +FROM --platform=${BUILDPLATFORM} fedora:${FEDORA_VERSION} AS base +ARG FEDORA_VERSION +ARG TARGETPLATFORM -RUN apk add --update --no-cache gcc libc-dev make git automake autoconf +COPY scripts/shared/dnf_install / -RUN git clone --depth 1 https://github.com/HewlettPackard/netperf \ - && git -C netperf reset --hard 3bc455b23f901dae377ca0a558e1e32aa56b31c4 -RUN cd netperf \ - && ./autogen.sh \ - && ./configure CFLAGS=-fcommon \ - && make -C src && make -C src install +RUN /dnf_install -a ${TARGETPLATFORM} -v ${FEDORA_VERSION} -r /output/nettest \ + glibc bash glibc-minimal-langpack coreutils-single libcurl-minimal \ + bind-utils curl-minimal iperf3 iputils netperf tcpdump +FROM scratch +ARG TARGETPLATFORM -FROM alpine +COPY --from=base /output/nettest / -WORKDIR /app - -ARG VERSION - -RUN apk add --no-cache \ - bash \ - bind-tools \ - curl \ - iputils \ - iperf3 \ - tcpdump - -COPY --from=0 /usr/local/bin/net* /usr/local/bin/ COPY scripts/nettest/* /app/ RUN echo ${VERSION} >> /app/version diff --git a/scripts/nettest/metricsproxy b/scripts/nettest/metricsproxy index 5f20f72d1..215c01b05 100755 --- a/scripts/nettest/metricsproxy +++ b/scripts/nettest/metricsproxy @@ -1,4 +1,4 @@ #!/bin/sh # Arguments: source-port target-IP target-port -exec /usr/bin/nc -v -lk -p "$1" -e nc "$2" "$3" +exec /usr/bin/ncat -v -lk -p "$1" -c "/usr/bin/ncat $2 $3" diff --git a/scripts/nettest/simpleserver b/scripts/nettest/simpleserver index c7aaf43e8..92e094f44 100755 --- a/scripts/nettest/simpleserver +++ b/scripts/nettest/simpleserver @@ -3,5 +3,5 @@ set -e while true do - echo -e "HTTP/1.1 200 OK\r\n\r\nHello World" | nc -l -p 8080 + echo -e "HTTP/1.1 200 OK\r\n\r\nHello World" | /usr/bin/ncat -l 8080 done diff --git a/scripts/shared/dnf_install b/scripts/shared/dnf_install new file mode 100755 index 000000000..c4bd17822 --- /dev/null +++ b/scripts/shared/dnf_install @@ -0,0 +1,66 @@ +#!/bin/bash + +# Installs packages using dnf to a named root: +# -a arch - use arch instead of the native arch +# -k - keep the package cache +# -r root - install to the named root instead of /output/base +# -v ver - use the given Fedora version (required) +# +# %arch in the package references will be replaced with the chosen arch + +set -e + +INSTALL_ROOT=/output/base + +# Limit the number of files so that dnf doesn't spend ages processing fds +if [[ $(ulimit -n) -gt 1048576 ]]; then + ulimit -n 1048576 +fi + +while getopts a:kr:v: o +do + case "$o" in + a) + ARCH="$OPTARG" + ;; + k) + KEEP_CACHE=true + ;; + r) + INSTALL_ROOT="$OPTARG" + ;; + v) + FEDORA_VERSION="$OPTARG" + ;; + *) + echo "$0 doesn't support $o" >&2 + exit 1 + ;; + esac +done +shift $((OPTIND - 1)) + +if [[ -n "${ARCH}" ]]; then + # Convert container arch to Fedora arch + ARCH="${ARCH##*/}" + case "${ARCH}" in + amd64) ARCH=x86_64;; + arm64) ARCH=aarch64;; + esac + arch_args="--forcearch ${ARCH}" +else + # This will be used later, but we won't force + ARCH="$(rpm -q --qf "%{arch}" rpm)" +fi + +[[ -z "${FEDORA_VERSION}" ]] && echo I need to know which version of Fedora to install, specify it with -v >&2 && exit 1 + +if [[ "${INSTALL_ROOT}" != /output/base ]] && [[ ! -d "${INSTALL_ROOT}" ]] && [[ -d /output/base ]]; then + cp -a /output/base "${INSTALL_ROOT}" +fi + +dnf -y --setopt=install_weak_deps=0 --nodocs --use-host-config ${arch_args} \ + --installroot "${INSTALL_ROOT}" --releasever "${FEDORA_VERSION}" \ + install "${@//\%arch/${ARCH}}" + +[[ "${KEEP_CACHE}" == true ]] || dnf -y ${arch_args} --installroot "${INSTALL_ROOT}" --releasever "${FEDORA_VERSION}" clean all