Files
rustnet/Dockerfile.static
Marco Cadetg 9289a0abb1 feat: add static musl binary builds for Linux (#103) (#113)
* feat: add static musl binary builds for Linux (#103)
* feat: add aarch64 static builds, clean up docs
2025-12-26 22:13:00 +01:00

62 lines
2.0 KiB
Docker

# Dockerfile for building static musl-linked RustNet binary
#
# Usage (with eBPF - default, recommended):
# docker build -f Dockerfile.static -t rustnet-static .
# docker run --rm -v $(pwd)/dist:/dist rustnet-static cp /build/target/release/rustnet /dist/
#
# Usage (without eBPF - smaller binary, ~5.2MB vs ~6.5MB):
# docker build -f Dockerfile.static --build-arg FEATURES="--no-default-features" -t rustnet-static .
FROM rust:alpine
ARG FEATURES=""
# Install build dependencies
# - musl-dev: musl C library headers
# - libpcap-dev: libpcap headers and static library (/usr/lib/libpcap.a)
# - pkgconfig: for finding library paths
# - build-base: basic build tools (make, gcc, etc.)
# - perl: required by some build scripts (ring crate)
# - elfutils-dev: libelf for eBPF (includes static library)
# - zlib-dev/zlib-static: compression library
# - zstd-dev/zstd-static: Zstandard compression (required by elfutils 0.189+)
# - clang/llvm: for eBPF compilation
# - linux-headers: kernel headers for eBPF
RUN apk add --no-cache \
musl-dev \
libpcap-dev \
pkgconfig \
build-base \
perl \
elfutils-dev \
zlib-dev \
zlib-static \
zstd-dev \
zstd-static \
clang \
llvm \
linux-headers
# Add rustfmt for eBPF skeleton generation
RUN rustup component add rustfmt
WORKDIR /build
# Copy source code
COPY . .
# Configure static linking for zstd
# This fixes the elfutils 0.189+ undeclared dependency on zstd
# See: https://github.com/libbpf/bpftool/issues/152
RUN mkdir -p .cargo && printf '[target.x86_64-unknown-linux-musl]\nrustflags = ["-C", "link-arg=-l:libzstd.a"]\n' > .cargo/config.toml
# Build configuration:
# - In Alpine/musl, binaries are statically linked by default
# - FEATURES arg controls whether eBPF is included (default) or disabled
# - --release: Optimized build
RUN cargo build --release ${FEATURES}
# Verify the binary is statically linked
RUN file target/release/rustnet && \
ldd target/release/rustnet 2>&1 || echo "Binary is statically linked"