**Bazelでコンテナイメージを作成する高速化手法**

2025/12/19 4:50

**Bazelでコンテナイメージを作成する高速化手法**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

要約

rules_img
は、コンパイル時にイメージデータをメタデータとして扱い、プッシュまたはロードが必要になったときのみブロブを移動することで Docker‑image のビルド方法を再考した Bazel ルールセットです。
rules_oci
が OCI レイアウト全体をローカルディスクにダウンロードするのに対し、
rules_img
は小さなマニフェスト(約10 KB)だけを取得し、各レイヤーの tarball とそのディスクリプタを Bazel の Content‑Addressable Storage (CAS) に書き込みます。実際のレイヤーブロブはユーザーが
bazel run
を実行するまでレジストリに残ります。その時点で pusher は既存レイヤーをレジストリから照会し、欠けているものだけを CAS からストリームして最終イメージをプッシュします。コンテナd や Docker にイメージをロードする場合も同様にインクリメンタルで、ローカルに既に存在しないレイヤーだけがストリームされます。

使用するには、

MODULE.bazel
bazel_dep(name = "rules_img", version = "<version>")
を追加し、次に
image_layer
image_manifest
を定義します。オプションの最適化としては、レイヤー内でハードリンクによる重複排除やシーク可能レイヤー用の eStargz サポートがあります。

結果としてデータ移動が劇的に削減されます:大きなベースイメージを数秒でプルでき、インクリメンタル Docker ロードはミリ秒単位で完了し、Remote Build Execution (RBE) 上のマニフェスト組み立ても高速化します。これにより帯域幅使用量が減少し、リモート実行トラフィックが抑えられ、CI パイプラインが迅速化され、コンテナ中心の DevOps ワークフロー全体の生産性が向上します。

本文

タイトル: Bazel がビルド時に数ギガバイトのベースイメージデータをダウンロードする理由
サブタイトル:

rules_img
で問題を解決する方法


問題点

  • Bazel でウェブアプリをビルド(すでに Bazel によってコンパイル済み)します。
  • それを Docker イメージにパッケージ化し、適切なベースレイヤーと設定を持たせる必要があります。
  • コンテナイメージ構築を追加すると:
    • CI が遅くなる(毎回大きなベースイメージをダウンロードするため)。
    • プッシュ操作が遅いと感じられる。

主な関係者

関係者役割
レジストリ (Docker Hub, gcr.io)コンテナイメージを保管。ベースをプルし、ビルド済みイメージをプッシュします。
ローカルマシン
bazel build
/
bazel run
が実行される場所。
リモート実行 & キャッシュアクションを実行し結果を保存するリモートマシン(Aspect, BuildBuddy など)。

コアの葛藤

ベースイメージを拡張したイメージをビルドするには、そのベースに関する情報が必要です:

  • どれだけの情報?
  • それはどこにある?

現在の方法:
rules_oci

データフロー

# ベースイメージをプル
pull(
    name = "ubuntu",
    image = "index.docker.io/library/ubuntu:24.04",
    digest = "...",
)

# イメージをビルド
oci_image(
    name = "app_image",
    base = "@ubuntu",      # 完全なローカルディレクトリ
    tars  = [":app_layer.tar"],
    entrypoint = ["/app/bin/server"],
)

# レジストリへプッシュ
oci_push(
    name = "push",
    image = ":app_image",
    repository = "gcr.io/my-project/app",
)

転送の概要

送信元 → 先データ
レジストリ → ローカルマシン完全なベースイメージ(数百 MB)
ローカルマシン → リモートキャッシュ完全なベースイメージ
リモートキャッシュ → 実行者完全なベースイメージ
リモートキャッシュ → ローカルマシン完全なベースイメージ
ローカルマシン → レジストリ欠落しているレイヤーのみ

改善された方法:
rules_img

データフロー

# ベースイメージをメタデータだけでプル
pull(
    name = "ubuntu",
    registry   = "index.docker.io",
    repository = "library/ubuntu",
    tag        = "24.04",
    digest     = "...",
)

# レイヤーをビルド
image_layer(
    name = "app_layer",
    srcs = {
        "/app/bin/server": "//cmd/server",
        "/app/config"     : "//configs:prod",
    },
)

# イメージを組み立て(メタデータのみ)
image_manifest(
    name   = "app",
    base   = "@ubuntu",       # メタデータだけ
    layers = [":app_layer"],
    entrypoint = ["/app/bin/server"],
)

# 実行時にプッシュ
image_push(
    name      = "push_app",
    image     = ":app",
    registry  = "ghcr.io",
    repository= "my-project/app",
    tag       = "latest",
)

転送の概要

送信元 → 先データ
レジストリ → ローカルマシンマニフェスト + コンフィグ(約10 KB)
ローカルマシン → リモートキャッシュメタデータのみ
リモートキャッシュ → ローカルマシン → レジストリ欠落しているブロブだけ(通常は新しいレイヤーのみ)

ベースレイヤーはほとんどローカルマシンやリモート実行者を通過しません。


重要性

  • イメージの組み立ては主に JSON と数個のチェックサムです。
  • 本当に大切なのは 正しいタイミングでバイト列を適切な場所へ移動させる ことです。
  • rules_img
    はまずメタデータを転送し、バイト列は境界(エッジ)だけで転送するため、不必要なダウンロードとアップロードを排除します。

歴史的背景

  1. rules_docker
    – すべての言語を統合しようとして保守が難しくなる。
  2. rules_oci
    – ディスク上で完全な OCI レイアウトを使用。ローカルでは動くが、リモート実行時に問題が生じる。
  3. rules_img
    – まずメタデータを扱い、必要に応じてバイト列のみストリームする。

主な設計決定

決定効果
マニフェスト & コンフィグだけをプルローカルマシンを軽量化し、レイヤーのダウンロードを実行時に遅延させる。
CAS にブロブを保存リモート実行者は全レイヤーをダウンロードする必要がない。
メタデータ専用プロバイダーアクションは迅速にスケジュールされ、キャッシュも効率的。
遅延プッシュ戦略レジストリへまず問い合わせてから、欠落しているブロブだけをストリーム。

追加のパフォーマンス向上

  • ハードリンクによる重複除去(レイヤー内)。
  • オプションで eStargz を使用しシーク可能レイヤー化。
  • Containerd と統合して incremental
    docker load
    が実現。

すぐに始める例

# MODULE.bazel
bazel_dep(name = "rules_img", version = "<latest>")

pull = use_repo_rule("@rules_img//img:pull.bzl", "pull")

pull(
    name = "ubuntu",
    registry   = "index.docker.io",
    repository = "library/ubuntu",
    tag        = "24.04",
    digest     = "...",
)

# BUILD.bazel
load("@rules_img//img:layer.bzl", "image_layer")
load("@rules_img//img:image.bzl", "image_manifest")

image_layer(
    name   = "app_layer",
    srcs   = {
        "/app/bin/server": "//cmd/server",
        "/app/config"     : "//configs:prod",
    },
    compress = "zstd",
)

image_manifest(
    name   = "app_image",
    base   = "@ubuntu",
    layers = [":app_layer"],
)

高速化のため

.bazelrc
を追加する場合:

common --@rules_img//img/settings:compress=zstd
common --@rules_img//img/settings:estargz=enabled
common --@rules_img//img/settings:push_strategy=lazy

まとめ

  • メタデータ優先 + バイトオンデマンド = CI の高速化、ノートパソコンの負荷低減、ビルドグラフのスケーラビリティ。
  • rules_img
    はベースイメージのダウンロードを数分から数秒へ短縮し、プッシュ時の不要な往復通信を排除します。
  • プロジェクトに導入してみてください。うまくいった点やまだ課題が残る点を共有しましょう。

始め方: https://github.com/bazel-contrib/rules_img

同じ日のほかのニュース

一覧に戻る →

2025/12/25 4:42

Show HN:ブラウザ内で動作し、すべてのデータをURLに保存するミニマリストエディタ

## Japanese Translation: GitHub は、Copilot、Spark、Models、および MCP Registry といった AI 搭載のエンタープライズグレードツール群を拡充し、開発者がより速く質の高いコードを書けるようにしています。これら新しいオファリングは、Actions、Codespaces、Issues、作業計画・追跡、コードレビュー、変更管理といった既存のワークフローを補完し、自動化やモデル用プロンプト管理、シークレット保護や脅威検知などのセキュリティ制御を追加します。企業向けには、Advanced Security、Copilot for Business、プレミアム 24/7 サポート、および標準的な DevSecOps パイプラインに組み込める AI 強化ビジネス分析などのエンタープライズ アドオンを導入しています。同時に、GitHub は Sponsors ファンディングや Security Lab、Maintainer Community、Accelerator、Archive Program などのプログラムを通じてオープンソース エコシステムを強化し、プロジェクトを健全に保ちます。総合的な目標は、個人貢献者、小規模チーム、大企業を問わず、医療・金融・製造・政府などさまざまな業界で利用できる、一貫性があり、安全かつ知能的な開発体験を提供することです。

2025/12/25 2:49

Show HN:Vibium ― AIと人間向けのブラウザ自動化(Selenium創設者による)

## Japanese Translation: Vibiumは軽量でGoベースのブラウザ自動化ライブラリで、AIエージェントが最小限のオーバーヘッドでChromeを制御できるようにします。単一の約10 MBバイナリとして配布され、WebDriver BiDiプロトコルとMCPサーバーを使用してブラウザを管理し、自動待機、要素ポーリング、ビューポートスクリーンショット(PNG)、不可視実行などの機能を提供します。開発者は `npm install vibium` でインストールでき、ライブラリは同期 (`browserSync`) と非同期 (`browser`) の両方のJavaScript/TypeScript APIを公開し、一般的なブラウザ操作に対応しています。 Claude Codeエージェントは次のように一歩でブラウザ制御を追加できます: `claude mcp add vibium -- npx -y vibium`; これによりセットアップ時にChromeも自動ダウンロードされます。ツールはLinux x64、macOS Intel x64、macOS Apple‑Silicon arm64、およびWindows x64をサポートし、Chromeとchromedriverをローカルにキャッシュしますが、`VIBIUM_SKIP_BROWSER_DOWNLOAD=1` を設定するとダウンロードをスキップできます。 主要なエージェントツールは次の通りです: - `browser_launch` - `browser_navigate` - `browser_find` - `browser_click` - `browser_type` - `browser_screenshot` - `browser_quit` VibiumはApache 2.0ライセンスでオープンソース化され、2025‑12‑22にnpmへ公開されました。将来計画(Roadmap V2)にはPython/Javaクライアント、Cortexメモリ/ナビゲーションレイヤー、Retina録画、動画キャプチャ、およびAI駆動のロケータが追加予定です。開発ガイドラインは `CONTRIBUTING.md` に、ロードマップ詳細は `V2-ROADMAP.md` に記載されています。このライブラリはAIエージェント向けにブラウザ自動化を簡素化し、開発者、テスター、およびデータ抽出ワークフローの利便性を高めることを目指しています。

2025/12/25 6:02

NVIDIAは、AIチップスタートアップGroqを約200億ドル(現金)で買収しています。

## Japanese Translation: (日本語訳) **改訂サマリー** Nvidia は、Groq の全資産を 200 億ドルの現金で買収することに合意し、同社史上最大規模の買収となります。この取引は、2023 年 9 月に Groq が約 6.9 億ドルの評価額で 7 億5,000 万ドルを調達した資金調達ラウンドと、Nvidia に対する推論技術の非独占ライセンス契約(価格は未公開)に続くものです。主要創業者である CEO のジョナサン・ロス氏と社長のサニー・マドラ氏を含む幹部が、ライセンス取得した技術を推進するために Nvidia に加わります。一方、Groq は財務責任者シモン・エドワーズ氏が率いる独立企業として残り、GroqCloud は取引の対象外であり、そのまま運営され続けます。 Nvidia は Groq の低レイテンシプロセッサを AI ファクトリーアーキテクチャに統合し、より広範な推論およびリアルタイムワークロードを実現すると同時に、GroqCloud を別個に保つ計画です。この買収は、10 月末時点で Nvidia の現金及び短期投資が 606 億ドル(2023 年初頭の 133 億ドルから増加)だったことを受けて行われました。 Groq は本年の売上高を 5 億ドルと目標設定しており、これは大規模言語モデル推論用 AI アクセラレータチップへの需要によって牽引されます。この動きは、Enfabrica との同様だが規模が小さい 9 億ドルの取引(CEO の採用と技術ライセンス)に続くものです。Nvidia の買収は歴史上最大の購入者として位置付けられ、ハードウェアポートフォリオとクラウドサービス提供への影響を拡大し、アクセラレータチップ市場で競合他社に影響を与える可能性があります。