Integration Tests: Build Images Once and Switch to fuse‑overlayfs

basecamp/kamal

Integration tests for Kamal were taking longer because Docker images were rebuilt on every test run and the default VFS storage driver conflicted with nested overlay mounts. The PR replaces the per‑run rebuild with a single build and adopts fuse‑overlayfs to avoid overlay‑on‑overlay failures. These changes keep the test behaviour identical while reducing overall execution time.

背景

Integration test suites that spin up Docker‑in‑Docker environments must construct images before each run, which adds several minutes to the total runtime. Additionally, the previous configuration used the VFS storage driver, which cannot nest overlay filesystems and therefore required the container to fall back to a slower copy‑on‑write mode. Both factors caused unnecessary latency without providing functional benefits, motivating a redesign of the test harness.

技術的な変更

イメージのビルドを一度だけ実行するロジックが追加されました。テスト実行中に $IMAGES_BUILT フラグを確認し、未ビルドの場合にのみ docker_compose "build" を走らせます。新たに導入された build_images_once メソッドは compose_up_with_retry の先頭で呼び出され、以降の up--no-build オプションでビルドをスキップします。

@@
   def compose_up_with_retry
-      docker_compose "up --build -d"
+      build_images_once
+      docker_compose "up -d --no-build"
@@
     def build_images_once
-      # existing logic removed
+      return if $IMAGES_BUILT
+      docker_compose "build"
+      $IMAGES_BUILT = true
     end

Dockerfile では fuse‑overlayfs パッケージをインストールする行が追加され、VFS に依存しないストレージドライバが利用可能になりました。これにより、Docker デーモンが内部で overlay2 を使用でき、ネストされたオーバーレイでも高速に動作します。

@@
-RUN apt-get update --fix-missing && apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
+RUN apt-get update --fix-missing && apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin fuse-overlayfs

同様の変更が test/integration/docker/vm/Dockerfile にも適用され、VM コンテナでも同一パッケージが利用可能です。

@@
-RUN apt-get update --fix-missing && apt-get -y install openssh-client openssh-server docker.io
+RUN apt-get update --fix-missing && apt-get -y install openssh-client openssh-server docker.io fuse-overlayfs

boot.sh スクリプトは storage-driverfuse‑overlayfs へ変更し、デーモン設定を更新しています。コメントも更新され、overlay2 がネストできない状況で fuse‑overlayfs がコピーオンライトを提供する旨が明記されています。

@@
-  "storage-driver": "vfs",
+  "storage-driver": "fuse-overlayfs",
@@
-  "storage-driver": "vfs",
+  "storage-driver": "fuse-overlayfs",

docker_compose "down" のタイムアウトが -t 1 から即時停止を意味する -t 0 へ変更され、テスト終了時のクリーンアップが迅速化されました。また、compose_up_with_retry の失敗時リトライロジックでも同様に即時停止が適用されています。

@@
-    docker_compose "down -t 1"
+    docker_compose "down -t 0"
@@
-      docker_compose "down -t 1", raise_on_error: false
+      docker_compose "down -t 0", raise_on_error: false

設計判断

fuse‑overlayfs を選択した理由は、Docker の overlay2 がネストされたオーバーレイをサポートせず、VFS では毎回全レイヤをコピーするためパフォーマンスが低下する点にあります。fuse‑overlayfs はカーネル空間の overlay2 と同様のコピーオンライト機構をユーザースペースで提供し、特権コンテナ内でも安全に使用できます。この選択は既存テストの挙動を変えずに、内部ストレージの効率化を実現します。

ビルドの重複を防ぐために グローバル変数 $IMAGES_BUILTbuild_images_once を導入した設計は、テストコードのシンプルさを保ちつつビルドコストを一次化します。フラグチェックは軽量であり、テスト全体のフローにほとんど影響を与えません。これにより、テスト実行時間の削減が保証されます。

まとめ

本 PR は、画像ビルドの一回化fuse‑overlayfs へのストレージドライバ切替という二つの改良で、Kamal の統合テスト速度を大幅に向上させました。機能的な振る舞いは変わらず、テスト環境の構成がシンプルかつ高速になった点が主な成果です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
187cc8be

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文→背景→技術的な変更→設計判断(任意)→まとめの流れが明確に構成されており、必要な要素がすべて揃っています。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは正しい `言語:ファイルパス` 形式で記述されていますが、PRリンクが `[PR #1884](URL)` となっており、要求される `[#1884](URL)` 形式と異なります。致命的ではありませんが、修正すると完全に合格になります。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

エンジニア向けの専門的な記述で、初心者向けの余計な解説はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論・各論・結論の段落構成になっており、トピックセンテンスが冒頭に配置されています。段落は6文未満で、空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは提供されたDiffと完全に一致しており、抜けや誤りは見られません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語(fuse‑overlayfs、overlay2、VFS など)はPR本文と一致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な説明はDiffとPRの記述に基づき、根拠があり論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記載された事実はすべてPR情報で裏付けられており、推測や捏造はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号 #1884 以外の数値・固有名詞は記載されていません。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルはPRの趣旨「Speed up integration tests」を適切に要約しており、内容と矛盾しません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンサポートやリリーススケジュール等、PR外の外部知識は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PRの記述と一致しています。