Skip to content

fix(status): devbase list/status のコンテナ状態を --project-name で正確化#40

Merged
takemi-ohama merged 2 commits into
mainfrom
fix/list-container-status-project-scope
Jun 7, 2026
Merged

fix(status): devbase list/status のコンテナ状態を --project-name で正確化#40
takemi-ohama merged 2 commits into
mainfrom
fix/list-container-status-project-scope

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

概要

devbase list(対話選択)および devbase status で、全プロジェクトのコンテナ状態が一律「running (1 containers)」と誤表示される不具合を修正します。

起動するプロジェクトを選択してください:
  [3] car-pricing  (carmo-ai, running (1 containers))   ← 実際は停止中
  [20] carmo-system-console  (carmo-system, running (1 containers))  ← 実際は 9 containers
  ...全プロジェクトが running (1 containers)

根本原因

各プロジェクト状態を取得する _container_status_forlib/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 upCOMPOSE_PROJECT_NAME = 各プロジェクト名(= entry.name) でコンテナを起動するため、同名で scope すれば正確に取得できます。

  • lib/devbase/commands/status.pydocker compose --project-name <name> ps ... に変更(理由をコメントで明記)
  • tests/plugin/test_container_status_for.py(新規)— env 汚染下でも entry.name で scope する回帰テスト2件

検証

COMPOSE_PROJECT_NAME=project-trygroup-prd-customer を設定した実環境で再現・修正後の正確化を確認:

project 修正前 修正後(実態と一致)
carmo-system-console running (1) running (9)
car-pricing running (1) stopped
carmo-ai running (1) running (1)
  • 全テスト: 427 passed, 1 skipped(新規2テスト含む)

🤖 Generated with Claude Code

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 takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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 takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

docker composeをサブプロセスでループするのは重いので、docker psで全コンテナ一覧を取得してパースする方が早くないですか?

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

ご指摘ありがとうございます。その通りで、プロジェクト数ぶん docker compose ps をサブプロセス起動するのは重いため、docker ps 1 回で全 running コンテナを取得し com.docker.compose.project ラベルごとに集計する方式へ変更しました(commit afda20e)。

  • _running_counts_by_project() を追加し docker ps を 1 回だけ実行 → {project名: running数} を返す
  • _container_status_for(entry, counts) は counts マップ参照のみ。list_projects / _get_container_status が 1 回集計して全 entry で使い回す
  • 副次効果として、ラベルで識別するため COMPOSE_PROJECT_NAME 継承の影響を構造的に受けなくなり、当初の --project-name scope 修正も不要化(より根本的な解消)
  • 単一 docker ps になったため list_projectsThreadPoolExecutor も廃止

プロジェクト数が増えてもサブプロセス起動は常に 1 回です。テストも起動回数 1 回・ラベル集計・env 非依存の検証へ更新済み(全 433 passed / ruff pass)。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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 takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正提案はありません。

@takemi-ohama takemi-ohama merged commit b0a7fdb into main Jun 7, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant