Zum Hauptinhalt springen

Erstellen eines bpftrace-Container-Images mit Dockerfile

BPFtrace ist ein leistungsstarkes Systemtracing-Tool basierend auf eBPF, das zur Verfolgung von System- und Anwendungsebenen-Dynamiken verwendet werden kann. Dieser Artikel führt ein, wie mit Dockerfile ein Docker-Image erstellt wird, das BPFtrace unterstützt, sodass dieses Tool in einer containerisierten Umgebung verwendet werden kann.

Dockerfile-Erläuterung

FROM r.j3ss.co/bcc

Das Basis-Image ist r.j3ss.co/bcc, ein vorgefertigtes Image, das die BCC-Toolsammlung (BPF Compiler Collection) enthält.

ENV PATH /usr/share/bcc/tools:$PATH

Setzen der PATH-Umgebungsvariable, damit BCC-Tools später direkt ausgeführt werden können.

RUN sed -i "s#deb http://deb.debian.org/debian buster main#deb http://deb.debian.org/debian buster main contrib non-free#g" /etc/apt/sources.list

Ändern der APT-Quellenliste, Hinzufügen von contrib- und non-free-Quellen, um die Installation einiger nicht-freier Softwarepakete zu gewährleisten.

RUN apt-get update && apt-get install -y \
ca-certificates \
clang \
curl \
gcc \
git \
g++ \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*

Installation einer Reihe von Abhängigkeiten, die zum Erstellen von BPFtrace erforderlich sind, einschließlich clang, gcc, git usw. Die Option --no-install-recommends vermeidet die Installation empfohlener Pakete und verringert die Image-Größe. Abschließend wird der APT-Cache gelöscht, um die Image-Größe weiter zu verringern.

ENV BPFTRACE_VERSION v0.10.0
RUN git clone --depth 1 --branch "$BPFTRACE_VERSION" https://github.com/iovisor/bpftrace.git /usr/src/bpftrace \
&& ( \
cd /usr/src/bpftrace \
&& mkdir build \
&& cd build \
&& cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr .. \
&& make -j8 \
&& make install \
) \
&& rm -rf /usr/src/bpftrace

Setzen der zu installierenden BPFtrace-Version und Klonen des Quellcodes von GitHub. Anschließend wird das Quellcode-Verzeichnis betreten, cmake generiert die Build-Dateien und der make-Befehl kompiliert und installiert BPFtrace. Die Option -j8 kann mehrere Kerne nutzen, um den Kompiliervorgang zu beschleunigen. Abschließend werden die temporären Build-Dateien bereinigt, um die Image-Größe zu verringern.

ENTRYPOINT ["bpftrace"]

Setzen des Einstiegspunkts des Containers auf den bpftrace-Befehl, sodass BPFtrace direkt beim Starten des Containers ausgeführt werden kann und die erforderlichen Parameter und Probe-Skripte übergeben werden können.

Image erstellen und verwenden

Verwenden Sie den folgenden Befehl, um basierend auf diesem Dockerfile ein Image zu erstellen:

docker build -t bpftrace:latest .

Nach Abschluss des Builds können Sie den Container mit dem folgenden Befehl starten und BPFtrace ausführen:

docker run --rm -it --privileged bpftrace:latest /usr/share/bcc/tools/execsnoop

Dieser Befehl führt das execsnoop-Tool aus, mit dem die Erstellung neuer Prozesse verfolgt werden kann. Die Option --privileged ist erforderlich, da BPFtrace auf Kernelfunktionen zugreifen muss.

Mit diesem Image können wir BPFtrace in einer kontrollierten und wiederholbaren Container-Umgebung für Leistungsanalysen, Fehlerbehebungen und andere Szenarien ausführen, was die Arbeitseffizienz erheblich steigert.

Vollständiges Skript

FROM r.j3ss.co/bcc

ENV PATH /usr/share/bcc/tools:$PATH

# Nicht-freie APT-Quellen hinzufügen
RUN sed -i "s#deb http://deb.debian.org/debian buster main#deb http://deb.debian.org/debian buster main contrib non-free#g" /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
ca-certificates \
clang \
curl \
gcc \
git \
g++ \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*

# BPFtrace erstellen
ENV BPFTRACE_VERSION v0.10.0
RUN git clone --depth 1 --branch "$BPFTRACE_VERSION" https://github.com/iovisor/bpftrace.git /usr/src/bpftrace \
&& ( \
cd /usr/src/bpftrace \
&& mkdir build \
&& cd build \
&& cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr .. \
&& make -j8 \
&& make install \
) \
&& rm -rf /usr/src/bpftrace

ENTRYPOINT ["bpftrace"]