メインコンテンツまでスキップ

Dockerfileを使ったbpftraceコンテナイメージの構築

BPFtraceはeBPFに基づいた強力なシステムトレースツールであり、システムおよびアプリケーションレベルの動的な操作を追跡するために使用できます。この記事では、Dockerfileを使用してbpftraceをサポートするDockerイメージを構築する方法を紹介し、このツールをコンテナ化された環境で使用できるようにします。

Dockerfileの説明

FROM r.j3ss.co/bcc

ベースイメージはr.j3ss.co/bccで、BCC(BPF Compiler Collection)ツールセットを含む事前に構築されたイメージです。

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

環境変数PATHを設定して、後でBCCツールを直接実行できるようにします。

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

APTソースリストを修正し、contribおよびnon-freeソースを追加して、一部の非フリーソフトウェアパッケージがインストールできるようにします。

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のビルドに必要な依存関係のシリーズをインストールします。これにはclanggccgitなどが含まれます。--no-install-recommendsオプションは推奨パッケージをインストールしないことにより、イメージのサイズを減らします。最後に、APTキャッシュをクリアしてイメージのサイズをさらに削減します。

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

インストールするBPFtraceのバージョンを設定し、GitHubからソースコードをクローンします。その後、ソースコードディレクトリに入り、cmakeを使用してビルドファイルを生成し、makeコマンドでBPFtraceをコンパイルおよびインストールします。-j8オプションは、複数のコアを使用してコンパイルプロセスを加速することができます。最後に、イメージのサイズを減らすために中間ビルドファイルを削除します。

ENTRYPOINT ["bpftrace"]

コンテナのエントリポイントをbpftraceコマンドに設定し、コンテナを起動するときにBPFtraceを直接実行し、必要なパラメータとプローブスクリプトを渡すことができます。

イメージのビルドと使用

以下のコマンドを使用して、このDockerfileに基づいてイメージをビルドします。

docker build -t bpftrace:latest .

ビルドが完了したら、以下のコマンドでコンテナを起動し、BPFtraceを実行できます。

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

このコマンドは、新しいプロセスの作成を追跡するexecsnoopツールを実行します。--privilegedオプションは、BPFtraceがカーネル機能にアクセスする必要があるため必要です。

このイメージを通じて、パフォーマンス分析、トラブルシューティングなどのシナリオで、制御可能で繰り返し可能なコンテナ環境でBPFtraceを実行することができ、作業効率を大幅に向上させることができます。

全スクリプト

FROM r.j3ss.co/bcc

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

# Add non-free apt sources
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/*

# Build 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"]