Saltar al contenido principal

Construyendo una imagen de contenedor bpftrace con Dockerfile

BPFtrace es una poderosa herramienta de trazado de sistemas basada en eBPF, que se puede utilizar para rastrear la dinámica de sistemas y aplicaciones. Este artículo presentará cómo construir una imagen de Docker que admita BPFtrace utilizando Dockerfile, de modo que esta herramienta pueda utilizarse en un entorno containerizado.

Explicación del Dockerfile

FROM r.j3ss.co/bcc

La imagen base es r.j3ss.co/bcc, que es una imagen precompilada que contiene el conjunto de herramientas BCC (BPF Compiler Collection).

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

Establece la variable de entorno PATH, para que las herramientas BCC puedan ejecutarse directamente más adelante.

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

Modifica la lista de fuentes de APT, agregando las fuentes contrib y non-free para asegurar que se puedan instalar algunos paquetes de software no gratuitos.

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

Instala una serie de dependencias requeridas para construir BPFtrace, incluyendo clang, gcc, git, etc. La opción --no-install-recommends evita instalar paquetes recomendados, reduciendo el tamaño de la imagen. Finalmente, limpia el caché de APT para reducir aún más el tamaño de la imagen.

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

Establece la versión de BPFtrace a instalar y clona el código fuente desde GitHub. Luego, ingresa al directorio del código fuente, usa cmake para generar archivos de compilación y usa el comando make para compilar e instalar BPFtrace. La opción -j8 puede utilizar múltiples núcleos para acelerar el proceso de compilación. Finalmente, limpia los archivos de compilación intermedios para reducir el tamaño de la imagen.

ENTRYPOINT ["bpftrace"]

Establece el punto de entrada del contenedor en el comando bpftrace, de modo que BPFtrace se pueda ejecutar directamente al iniciar el contenedor, y se puedan pasar los parámetros y scripts de sonda requeridos.

Construyendo y utilizando la imagen

Utilice el siguiente comando para construir la imagen basada en este Dockerfile:

docker build -t bpftrace:latest .

Después de que se complete la compilación, puede iniciar el contenedor y ejecutar BPFtrace con el siguiente comando:

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

Este comando ejecuta la herramienta execsnoop, que puede rastrear la creación de nuevos procesos. La opción --privileged es requerida porque BPFtrace necesita acceder a las características del kernel.

A través de esta imagen, podemos ejecutar BPFtrace en un entorno de contenedor controlado y repetible para análisis de rendimiento, solución de problemas y otros escenarios, mejorando enormemente la eficiencia del trabajo.

Script completo

FROM r.j3ss.co/bcc

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

# Agregar fuentes apt no gratuitas
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/*

# Construir bpftrace
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"]