docker/Dockerfile.builder (85 lines of code) (raw):

ARG SCRATCH=/misc/scratch # Stage 1: Build static bpftool # This step is required specifically to maintain support for # centos7. bpftool is available on newer distros via package # manager, but elastic/ebpf is built on centos7 to workaround # glibc's unsupported backwards-compatibility. Here, we build # a static bpftool on a newer ubuntu and copy it to centos7 # builder image to generate skeleton headers. FROM docker.io/ubuntu:jammy as bpftool-builder ARG SCRATCH ENV DEBIAN_FRONTEND=noninteractive RUN mkdir -p $SCRATCH RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ gcc \ libelf-dev \ libz-dev \ make \ openssl \ python3 \ wget RUN mkdir -p $SCRATCH/kernel \ && wget -qO- https://github.com/torvalds/linux/archive/refs/tags/v5.18.tar.gz | tar --strip-components=1 -xz -C $SCRATCH/kernel RUN CFLAGS=-static make -C $SCRATCH/kernel/tools/bpf/bpftool # Stage 2: Centos 7 ebpf-builder FROM docker.io/centos:7 as ebpf-builder ARG SCRATCH RUN mkdir -p $SCRATCH COPY --from=bpftool-builder $SCRATCH/kernel/tools/bpf/bpftool/bpftool /usr/local/bin/bpftool RUN yum install -y centos-release-scl-rh epel-release RUN yum upgrade -y RUN yum install -y binutils \ file \ glibc-static \ groff-base \ llvm-toolset-7.0-llvm \ m4 \ make \ devtoolset-10* \ rh-python38 \ wget \ which \ xz RUN mkdir -p $SCRATCH/bmake/src \ && wget -qO- "https://github.com/arichardson/bmake/tarball/master" | tar --strip-components=1 -xz -C $SCRATCH/bmake/src RUN cd $SCRATCH/bmake/src \ && CFLAGS="${CFLAGS} -DLIBBSD_OVERLAY -I/usr/include/bsd" ./boot-strap --install-prefix=/usr --install-host-target RUN cd $SCRATCH/bmake/src \ && ./boot-strap op=install --install-prefix=/usr \ && rm -rf $SCRATCH/bmake # Kludge: # ld on newer toolsets only likes -soname=<value> format, and bmake's mk files # use -soname <value> format. RUN sed -i -e 's/-soname /-soname=/g' /usr/share/mk/lib.mk RUN wget -qO- "https://cmake.org/files/v3.22/cmake-3.22.2-linux-`arch`.tar.gz" | tar --strip-components=1 -xz -C /usr # Instead of building newer LLVM/CLANG for bpf, use Zig! 'zig cc[++]' is a drop-in # replacement for clang[++] RUN wget -qO- "https://ziglang.org/download/0.9.1/zig-linux-`arch`-0.9.1.tar.xz" \ | tar -xJ --strip-components=1 -C /usr/local \ && mv /usr/local/zig /usr/local/bin/zig # Alas, zig doesn't package llvm-strip. But we don't need a new version of llvm-strip! # Use the latest one available from package manager. RUN printf "#!/bin/bash\nsource scl_source enable llvm-toolset-7.0\nexec llvm-strip \"\$@\"\n" > /usr/bin/llvm-strip \ && chmod a+x /usr/bin/llvm-strip RUN printf "#!/bin/bash\nsource scl_source enable rh-python38\nexec python3 \"\$@\"\n" > /usr/bin/python3 \ && chmod a+x /usr/bin/python3 RUN printf "#!/bin/bash\nsource scl_source enable rh-python38\nexec pip3 \"\$@\"\n" > /usr/bin/pip3 \ && chmod a+x /usr/bin/pip3 # Install clang-format. Anything to not build/maintain clang/llvm. RUN python3 -m pip install --no-cache --upgrade pip clang-format==14.0.6 RUN printf "#!/bin/bash\nsource scl_source enable rh-python38\nexec clang-format \"\$@\"\n" > /usr/bin/clang-format \ && chmod a+x /usr/bin/clang-format # Create symlinks to avoid managing paths RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec gcc \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-gcc RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec g++ \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-g++ RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec ar \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-ar RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec nm \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-nm RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec ranlib \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-ranlib RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec ld \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-ld RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec strip \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-strip RUN printf "#!/bin/bash\nsource scl_source enable devtoolset-10\nexec objcopy \"\$@\"\n" > /usr/bin/`arch`-linux-gnu-objcopy RUN chmod a+x /usr/bin/*-linux-gnu-* RUN rm -rf /usr/bin/gcc && ln -s /usr/bin/`arch`-linux-gnu-gcc /usr/bin/gcc RUN rm -rf /usr/bin/g++ && ln -s /usr/bin/`arch`-linux-gnu-g++ /usr/bin/g++ RUN rm -rf /usr/bin/ar && ln -s /usr/bin/`arch`-linux-gnu-ar /usr/bin/ar RUN rm -rf /usr/bin/nm && ln -s /usr/bin/`arch`-linux-gnu-nm /usr/bin/nm RUN rm -rf /usr/bin/ranlib && ln -s /usr/bin/`arch`-linux-gnu-ranlib /usr/bin/ranlib RUN rm -rf /usr/bin/strip && ln -s /usr/bin/`arch`-linux-gnu-strip /usr/bin/strip RUN rm -rf /usr/bin/objcopy && ln -s /usr/bin/`arch`-linux-gnu-objcopy /usr/bin/objcopy RUN rm -rf /usr/bin/ld && ln -s /usr/bin/`arch`-linux-gnu-ld /usr/bin/ld RUN rm -rf /usr/bin/cc && ln -s /usr/bin/`arch`-linux-gnu-gcc /usr/bin/cc RUN rm -rf /usr/bin/c++ && ln -s /usr/bin/`arch`-linux-gnu-g++ /usr/bin/c++ # Cleanup RUN rm -rf $SCRATCH RUN yum clean all RUN rm -rf /var/log/* # Finally, squash everything to merge overlapping fs layers FROM scratch as squashed COPY --from=ebpf-builder / / ENV PATH="${PATH}:/usr/local/bin" ENV NOCONTAINER=TRUE ENV MAKESYSPATH=/usr/share/mk LABEL org.opencontainers.image.source https://github.com/elastic/ebpf