Integrationテスト向けLinux 7 / Docker 29対応の修正
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.yml の image: traefik:v2.10 を image: 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.sh に for backend in legacy nft; do … ループを追加し、iptables-legacy と iptables-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 起動スクリプトに限定され、既存機能への侵食は最小限に抑えつつ、環境依存の失敗を根本的に解消しています。