Skip to content

Commit 4d16449

Browse files
authored
fix(compose): scale 生成時に depends_on の dev 参照を書き換える (#12)
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 が利用可能になる。
1 parent 648a486 commit 4d16449

1 file changed

Lines changed: 38 additions & 2 deletions

File tree

lib/devbase/volume/compose.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,38 @@ def _deep_copy(obj: Any) -> Any:
2525
return obj
2626

2727

28+
def _rewrite_depends_on(
29+
service_config: Dict[str, Any],
30+
dev_service_name: str,
31+
scale: int,
32+
) -> None:
33+
"""Rewrite `depends_on: <dev>` references to scaled instances (dev-1, ..., dev-N).
34+
35+
Supports both list form (`depends_on: [dev, mysql]`) and map form
36+
(`depends_on: {dev: {condition: service_healthy}}`). For scale > 1 a
37+
single `dev` reference is expanded to every dev-i instance so that the
38+
dependent service waits for all of them.
39+
"""
40+
deps = service_config.get('depends_on')
41+
if not deps:
42+
return
43+
44+
instance_names = [f"{dev_service_name}-{i}" for i in range(1, scale + 1)]
45+
46+
if isinstance(deps, list):
47+
new_deps = []
48+
for d in deps:
49+
if d == dev_service_name:
50+
new_deps.extend(instance_names)
51+
else:
52+
new_deps.append(d)
53+
service_config['depends_on'] = new_deps
54+
elif isinstance(deps, dict) and dev_service_name in deps:
55+
condition = deps.pop(dev_service_name)
56+
for name in instance_names:
57+
deps[name] = _deep_copy(condition)
58+
59+
2860
def _replace_volumes_for_instance(
2961
volumes: list, ai_volume: str, work_volume: str,
3062
) -> list:
@@ -164,10 +196,14 @@ def generate_scaled_compose(
164196
# Build scaled compose
165197
scaled_config = {'services': {}}
166198

167-
# Copy non-dev services (mysql, valkey, etc.) as-is
199+
# Copy non-dev services (mysql, valkey, etc.) — rewriting any
200+
# `depends_on: <dev>` reference to the scaled instances (dev-1..N) so
201+
# service_healthy chains keep working after dev is renamed.
168202
for service_name, service_config in services.items():
169203
if service_name != dev_service_name:
170-
scaled_config['services'][service_name] = _deep_copy(service_config)
204+
copied = _deep_copy(service_config)
205+
_rewrite_depends_on(copied, dev_service_name, scale)
206+
scaled_config['services'][service_name] = copied
171207

172208
# Generate a service for each instance
173209
for i in range(1, scale + 1):

0 commit comments

Comments
 (0)