Integrationテスト向けLinux 7 / Docker 29対応の修正

basecamp/kamal

Linux 7 上の Docker 29 環境で失敗していた統合テストを、正規表現・ヘルスチェック・Docker 設定の更新で安定化させました。主な変更はテストのイメージマッチング、Traefik のイメージバージョン上げ、VFS ストレージドライバ導入、iptables バックエンド自動選択です。

背景

Linux カーネル 7 系と Docker 29 の組み合わせでは、オーバーレイファイルシステムの二重マウントが失敗し、テストコンテナが起動できませんでした。また、Docker が内部で pgrep sleep に依存したヘルスチェックが docker info コマンドの実行失敗で誤判定するケースが報告されていました。さらに、iptables のバックエンドが nftables のみの場合、Docker が NAT テーブルを作成できずネットワーク関連テストが失敗していました。これらの問題を解消し、CI 環境でも再現性のあるテスト実行を可能にするための改修が必要でした。

技術的な変更

正規表現の更新: test/integration/app_test.rb でイメージ名のマッチングを localhost:5000/app[:\s]+#{latest_app_version} および localhost:5000/app[:\s]+latest に変更し、ポート表記後のコロンや空白を許容しました。これにより新しいイメージタグ形式でもテストが通ります。

ヘルスチェックの改修: Dockerfile 系で HEALTHCHECK --interval=1s CMD pgrep ... から HEALTHCHECK --interval=1s CMD docker info > /dev/null 2>&1 && pgrep ...(deployer)または HEALTHCHECK --interval=1s CMD docker info > /dev/null 2>&1(vm)へ変更しました。docker info が正常に返ることを確認してからプロセス検査を行うことで、Docker 起動直後の偽陰性を防止します。

Traefik イメージの更新: test/integration/docker/deployer/app_with_traefik/config/deploy.ymlimage: traefik:v2.10image: traefik:v3.6 に置き換え、Docker 29 が要求する最新の Traefik バージョンに適合させました。

VFS ストレージドライバの導入: boot.sh 系で mkdir -p /etc/docker && echo '{"storage-driver": "vfs"}' > /etc/docker/daemon.json を常に実行し、VFS ドライバを強制的に使用するようにしました。VFS はオーバーレイ上のオーバーレイ(overlay‑on‑overlay)失敗を回避し、コンテナ内 Docker デーモンの安定稼働を保証します。

iptables バックエンド自動選択ロジック: boot.shfor backend in legacy nft; do … ループを追加し、iptables-legacyiptables-nft のどちらが NAT テーブルを読むことができるかを検査してから update-alternatives で設定します。これにより、レガシーモジュールが有効な環境でも、nftables のみの環境でも適切なバックエンドが使われます。

設計判断

ストレージドライバのハードコード: VFS を明示的に設定することで、環境依存のファイルシステムエラーを排除し、テスト環境の再現性を高めました。Docker の公式推奨ではないものの、CI のコンテナ内部でのみ使用する点で影響範囲を限定しています。

iptables バックエンドの動的選択: 従来は iptables-legacy に固定していましたが、nftables 専用ホストでの失敗を踏まえて、両方を試行し最初に成功したものを選ぶ設計に変更しました。追加コードは数行で済み、既存のスクリプトロジックを大きく乱すことなく柔軟性を向上させています。

Traefik バージョン上げの選択: Docker 29 が要求する最新の Traefik 3 系へバージョンを上げることで、互換性と機能改善を同時に享受でき、テストで使用するプロキシの挙動が期待通りになることを保証します。設定キーは変わらず image のみ更新し、既存のデプロイロジックへの影響はありません。

まとめ

本PRは Linux 7 / Docker 29 環境での統合テスト実行を可能にするため、正規表現、ヘルスチェック、ストレージドライバ、iptables バックエンド、Traefik バージョンの5点を修正しました。変更はテストコードと Docker 起動スクリプトに限定され、既存機能への侵食は最小限に抑えつつ、環境依存の失敗を根本的に解消しています。

記事メタデータ

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

この記事は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 #1871](URL)」となっており、仕様の「[#123](URL)」と完全には一致していない。リンク自体は機能するが形式違いとして警告を出す。

対象読者への適合性 ✓ PASS

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

エンジニア向けの技術的記述に留まり、初心者向けの過度な説明はない。

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

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

各セクションは総論→各論→結論の構成を保ち、段落はトピックセンテンスで始まり1段落1トピック、長さも適切で空行で区切られている。

Diff内容との照合 ✓ PASS

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

記事に記載された正規表現変更、HEALTHCHECK の修正、Traefik バージョン更新、VFS 設定、iptables バックエンド自動選択はすべて Diff 内容と一致している。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

VFS、storage-driver、iptables-legacy、iptables-nft、HEALTHCHECK などの用語が正確に使用され、PR・Diff と整合している。

説明の技術的正確性 ✓ PASS

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

各変更の背景と効果が技術的に正しく説明されており、Diff の実装と因果関係が明確。誤った主張はない。

事実の突合 ✓ PASS

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

記事の主張はすべて PR タイトル、Description、Diff で裏付けられている。外部情報の捏造や推測は見られない。

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

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

PR 番号 #1871、変更点の数(5点)などが正確。数値の誤りはない。

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

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

記事タイトルは PR の内容「Fixes for integration tests on Linux 7/Docker 29」を日本語で適切に表現している。

外部知識の正確性 ✓ PASS

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

LTS、EOL、リリース日程等の外部知識は記載されておらず、PR に基づく情報のみで構成されている。

時間表現の正確性 ✓ PASS

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

時間表現は使用されていないため問題なし。