BusyBoxしたい(busybox)
$ docker run -it --rm busybox
BusyBoxはLinuxの基本的なコマンドが揃った軽量イメージです。 約300~400個のUNIXコマンド(アプレット)を単一バイナリに統合しており、イメージサイズは1~2MBと非常に軽量です。 特定のコマンドをまとめたコンテナーを作成するときや、デバッグ、テストに活躍します。
コマンドを確認したい
$ docker run --rm busybox busybox --list
busybox --listコマンドで、利用可能なコマンド一覧を確認できます。
BusyBoxには以下のようなコマンドが含まれています。
ファイル操作:
cat,ls,rm,cp,mv,mkdir,findネットワーク:
ping,wget,ip,route,nslookupテキスト処理:
grep,sed,awk,echo,head,tailシステム管理:
mount,umount,ps,top,kill圧縮:
gzip,tar,unzip
composeしたい
services:
app:
image: myapp:latest
depends_on:
init-check:
condition: service_completed_successfully
ports:
- "8080:8080"
# データベース起動待ち用コンテナー
init-check:
image: busybox
command: >
sh -c "
echo 'Waiting for database...'
until wget -q -O- http://db:5432 > /dev/null 2>&1; do
echo 'Database not ready, waiting...'
sleep 2
done
echo 'Database is ready!'
"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: password
BusyBoxはスタンドアロンで動作させるより、docker composeなどのマルチコンテナー環境と
組み合わせて補助的なサービスとして活用するとよいツールです。
上記は、アプリケーション起動前に依存サービスの準備ができるまで待機するサンプルです。
ログ監視したい
services:
web:
image: nginx:latest
volumes:
- logs:/var/log/nginx
api:
image: myapi:latest
volumes:
- logs:/var/log/app
# ログ監視コンテナー
log-monitor:
image: busybox
command: tail -f /logs/nginx/access.log /logs/app/app.log
volumes:
- logs:/logs
depends_on:
- web
- api
volumes:
logs:
複数のサービスのログを集約して監視するサンプルです。
ボリュームを初期化したい
services:
app:
image: myapp:latest
volumes:
- data:/app/data
depends_on:
data-init:
condition: service_completed_successfully
# データディレクトリの初期化
data-init:
image: busybox
command: >
sh -c "
echo 'Initializing data directory...'
mkdir -p /data/uploads
mkdir -p /data/config
echo 'Initialization complete'
"
volumes:
- data:/data
volumes:
data:
起動時に共有ボリュームを初期化するサンプルです。
ネットワーク診断したい
services:
web:
image: nginx:latest
networks:
- app-net
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: password
networks:
- app-net
# 診断用コンテナー(開発時のみ)
debug:
image: busybox
command: sh
stdin_open: true
tty: true
networks:
- app-net
networks:
app-net:
開発時にサービス間の通信をテストするサンプルです。
1$ docker-compose run --rm debug sh
2
3# コンテナー内でネットワークテスト
4/ # ping web
5/ # nslookup db
6/ # wget -O- http://web
起動後にシェルを起動し診断を実行できます。
最小サイズのイメージを作りたい
1FROM busybox:latest
2
3# アプリケーションをコピー
4COPY my-app /usr/local/bin/
5RUN chmod +x /usr/local/bin/my-app
6
7ENTRYPOINT ["/usr/local/bin/my-app"]
または、マルチステージビルド:
1FROM golang:1.21 as builder
2WORKDIR /app
3COPY . .
4RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
5
6FROM busybox:latest
7COPY --from=builder /app/myapp /usr/local/bin/
8ENTRYPOINT ["/usr/local/bin/myapp"]
GoアプリやRustアプリなど、単一バイナリで動くアプリであれば、 BusyBoxを使って軽量なアプリケーション用の最小イメージを作成できます。
BusyBoxの特徴
メリット
超軽量なイメージサイズ 1~2MBの非常にコンパクトなイメージ。ネットワーク転送、ストレージが効率的。
200以上のUNIXコマンド搭載 基本的なファイル操作、テキスト処理、ネットワーク診断コマンドが利用可能。
マルチコンテナー環境に最適 Init Container、Sidecar、デバッグコンテナーなど補助的な役割で活躍。
依存関係が最小 glibc、追加パッケージが不要で、セキュリティリスクが低い。
デメリット
スタンドアロン用途には不向き メインアプリケーションのベースイメージとしては機能が不足する場合がある。
高度な機能がない パッケージマネージャー、開発ツール、シェルスクリプト機能が限定的。
エラーメッセージが簡潔 問題診断時に詳細な情報が得られないことがある。
最適な用途
Kubernetes Init Container(起動待ちチェック用)。
Sidecar Container(ログ監視、メトリクス収集)。
マルチコンテナー環境での診断・デバッグ用。
単一バイナリアプリケーションのベースイメージ。
軽量で高速なコンテナーが必要な環境。
IoT、エッジコンピューティング環境。