From 876373c1284f8769f889c63f4467efadc5b908f0 Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Wed, 20 May 2026 10:11:04 +0900 Subject: [PATCH] =?UTF-8?q?fix(compose):=20scale=20=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=99=82=E3=81=AB=20depends=5Fon=20=E3=81=AE=20dev=20=E5=8F=82?= =?UTF-8?q?=E7=85=A7=E3=82=92=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generate_scaled_compose が dev サービスを dev-1..dev-N にリネームする際、 他サービスの depends_on: dev 参照が書き換えられず、scaled compose で 未定義サービスへの依存となって docker compose up が失敗していた。 _rewrite_depends_on() を追加し、list 形式と map 形式 (condition 付き) の 両方で dev 参照を dev-i に展開する。scale > 1 の場合は全インスタンスへ 展開して service_healthy チェーンが正しく機能するようにする。 これにより compose.yml 側で dev の healthcheck と他サービスからの depends_on: dev: condition: service_healthy が利用可能になる。 --- lib/devbase/volume/compose.py | 40 +++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/lib/devbase/volume/compose.py b/lib/devbase/volume/compose.py index a069f25..b907036 100644 --- a/lib/devbase/volume/compose.py +++ b/lib/devbase/volume/compose.py @@ -25,6 +25,38 @@ def _deep_copy(obj: Any) -> Any: return obj +def _rewrite_depends_on( + service_config: Dict[str, Any], + dev_service_name: str, + scale: int, +) -> None: + """Rewrite `depends_on: ` references to scaled instances (dev-1, ..., dev-N). + + Supports both list form (`depends_on: [dev, mysql]`) and map form + (`depends_on: {dev: {condition: service_healthy}}`). For scale > 1 a + single `dev` reference is expanded to every dev-i instance so that the + dependent service waits for all of them. + """ + deps = service_config.get('depends_on') + if not deps: + return + + instance_names = [f"{dev_service_name}-{i}" for i in range(1, scale + 1)] + + if isinstance(deps, list): + new_deps = [] + for d in deps: + if d == dev_service_name: + new_deps.extend(instance_names) + else: + new_deps.append(d) + service_config['depends_on'] = new_deps + elif isinstance(deps, dict) and dev_service_name in deps: + condition = deps.pop(dev_service_name) + for name in instance_names: + deps[name] = _deep_copy(condition) + + def _replace_volumes_for_instance( volumes: list, ai_volume: str, work_volume: str, ) -> list: @@ -164,10 +196,14 @@ def generate_scaled_compose( # Build scaled compose scaled_config = {'services': {}} - # Copy non-dev services (mysql, valkey, etc.) as-is + # Copy non-dev services (mysql, valkey, etc.) — rewriting any + # `depends_on: ` reference to the scaled instances (dev-1..N) so + # service_healthy chains keep working after dev is renamed. for service_name, service_config in services.items(): if service_name != dev_service_name: - scaled_config['services'][service_name] = _deep_copy(service_config) + copied = _deep_copy(service_config) + _rewrite_depends_on(copied, dev_service_name, scale) + scaled_config['services'][service_name] = copied # Generate a service for each instance for i in range(1, scale + 1):