fix(status): devbase list/status のコンテナ状態を --project-name で正確化#40
Conversation
devbase list / status の各プロジェクト状態取得 (_container_status_for) が docker compose ps を親環境の COMPOSE_PROJECT_NAME を継承したまま実行しており、 全プロジェクトが同一 (カレント) プロジェクトの状態を返していた。 bin/devbase は常に COMPOSE_PROJECT_NAME を export するため、これを継承した devbase list の python プロセス → docker compose ps サブプロセスが env を ディレクトリ由来名より優先し、一覧が一律「running (1 containers)」になる。 PLAN06 で list が対話デフォルト化し全プロジェクトの状態を表示するように なったことで顕在化した既存バグ。 docker compose に --project-name <entry.name> を明示指定 (CLI フラグは 継承 env より優先) して各プロジェクト名で scope する。devbase up は COMPOSE_PROJECT_NAME = 各プロジェクト名でコンテナを起動するため、同名で scope すれば正確に取得できる。 回帰テスト (tests/plugin/test_container_status_for.py) を追加し、env 汚染下でも entry.name で scope することを検証。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | APPROVE
The fix correctly scopes docker compose ps by adding --project-name and includes a solid regression test.
takemi-ohama
left a comment
There was a problem hiding this comment.
docker composeをサブプロセスでループするのは重いので、docker psで全コンテナ一覧を取得してパースする方が早くないですか?
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | APPROVE
修正提案はありません。
devbase list / status の状態取得が「プロジェクト数ぶん docker compose ps を
サブプロセス起動」していたのを、単一の docker ps で全 running コンテナを
com.docker.compose.project ラベルごとに集計する方式へ変更する。
- _running_counts_by_project() を追加: docker ps を 1 回だけ実行し
{project名: running数} を返す。
- _container_status_for(entry, counts) は counts マップを参照するだけに変更。
呼び出し側 (_get_container_status / list_projects) が 1 回集計して全 entry で
使い回す。ラベルで識別するため COMPOSE_PROJECT_NAME 継承の影響も構造的に
受けなくなり、前コミットの --project-name scope は不要になった。
- list_projects の ThreadPoolExecutor を廃止 (単一 docker ps なので並列化不要)。
- status.py の未使用 json import を削除。
プロジェクト数が増えてもサブプロセス起動は常に 1 回で済む。
テストも docker ps 集計方式の検証へ更新 (起動回数 1 回・ラベル集計・env 非依存)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
ご指摘ありがとうございます。その通りで、プロジェクト数ぶん
プロジェクト数が増えてもサブプロセス起動は常に 1 回です。テストも起動回数 1 回・ラベル集計・env 非依存の検証へ更新済み(全 433 passed / ruff pass)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | APPROVE
The change to use a single docker ps call is a significant performance improvement, and the error handling for cases where Docker is unavailable is robust. The implementation is clean and well-tested.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | APPROVE
修正提案はありません。
概要
devbase list(対話選択)およびdevbase statusで、全プロジェクトのコンテナ状態が一律「running (1 containers)」と誤表示される不具合を修正します。根本原因
各プロジェクト状態を取得する
_container_status_for(lib/devbase/commands/status.py)が、docker compose psを親環境のCOMPOSE_PROJECT_NAMEを継承したまま実行していました。bin/devbaseは起動時に常にexport COMPOSE_PROJECT_NAME=$(basename "$PWD")(cd時もexport COMPOSE_PROJECT_NAME="$name")を設定します。この値がdevbase listの Python プロセス → 各docker compose psサブプロセスへ継承され、docker compose は継承 env をディレクトリ由来名より優先するため、全プロジェクトのクエリが同一(カレント)プロジェクトに解決されていました。PLAN06 で
listが対話デフォルト化し全プロジェクトの状態を一覧表示するようになったことで顕在化した既存バグです。修正
docker composeに--project-name <entry.name>を明示指定します(CLI フラグは継承 env より優先)。devbase upはCOMPOSE_PROJECT_NAME = 各プロジェクト名(= entry.name)でコンテナを起動するため、同名で scope すれば正確に取得できます。lib/devbase/commands/status.py—docker compose --project-name <name> ps ...に変更(理由をコメントで明記)tests/plugin/test_container_status_for.py(新規)— env 汚染下でもentry.nameで scope する回帰テスト2件検証
COMPOSE_PROJECT_NAME=project-trygroup-prd-customerを設定した実環境で再現・修正後の正確化を確認:🤖 Generated with Claude Code