diff --git a/compose/config/config.py b/compose/config/config.py index 243529bd6..7b3969b6c 100644 --- a/compose/config/config.py +++ b/compose/config/config.py @@ -1114,6 +1114,7 @@ def merge_deploy(base, override): md['resources'] = dict(resources_md) if md.needs_merge('placement'): placement_md = MergeDict(md.base.get('placement') or {}, md.override.get('placement') or {}) + placement_md.merge_scalar('max_replicas_per_node') placement_md.merge_field('constraints', merge_unique_items_lists, default=[]) placement_md.merge_field('preferences', merge_unique_objects_lists, default=[]) md['placement'] = dict(placement_md) diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py index 8b0d37526..63eece17e 100644 --- a/tests/unit/config/config_test.py +++ b/tests/unit/config/config_test.py @@ -2543,6 +2543,7 @@ web: 'labels': ['com.docker.compose.a=1', 'com.docker.compose.b=2'], 'mode': 'replicated', 'placement': { + 'max_replicas_per_node': 1, 'constraints': [ 'node.role == manager', 'engine.labels.aws == true' ], @@ -2599,6 +2600,7 @@ web: 'com.docker.compose.c': '3' }, 'placement': { + 'max_replicas_per_node': 1, 'constraints': [ 'engine.labels.aws == true', 'engine.labels.dev == true', 'node.role == manager', 'node.role == worker'