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、エッジコンピューティング環境。

リファレンス