diff --git a/compose/config/config.py b/compose/config/config.py index df98dcb49..adfb53d8f 100644 --- a/compose/config/config.py +++ b/compose/config/config.py @@ -709,14 +709,7 @@ def process_service(service_config): ] if 'build' in service_dict: - if isinstance(service_dict['build'], six.string_types): - service_dict['build'] = resolve_build_path(working_dir, service_dict['build']) - elif isinstance(service_dict['build'], dict): - if 'context' in service_dict['build']: - path = service_dict['build']['context'] - service_dict['build']['context'] = resolve_build_path(working_dir, path) - if 'labels' in service_dict['build']: - service_dict['build']['labels'] = parse_labels(service_dict['build']['labels']) + process_build_section(service_dict, working_dir) if 'volumes' in service_dict and service_dict.get('volume_driver') is None: service_dict['volumes'] = resolve_volume_paths(working_dir, service_dict) @@ -724,6 +717,9 @@ def process_service(service_config): if 'sysctls' in service_dict: service_dict['sysctls'] = build_string_dict(parse_sysctls(service_dict['sysctls'])) + if 'labels' in service_dict: + service_dict['labels'] = parse_labels(service_dict['labels']) + service_dict = process_depends_on(service_dict) for field in ['dns', 'dns_search', 'tmpfs']: @@ -737,6 +733,17 @@ def process_service(service_config): return service_dict +def process_build_section(service_dict, working_dir): + if isinstance(service_dict['build'], six.string_types): + service_dict['build'] = resolve_build_path(working_dir, service_dict['build']) + elif isinstance(service_dict['build'], dict): + if 'context' in service_dict['build']: + path = service_dict['build']['context'] + service_dict['build']['context'] = resolve_build_path(working_dir, path) + if 'labels' in service_dict['build']: + service_dict['build']['labels'] = parse_labels(service_dict['build']['labels']) + + def process_ports(service_dict): if 'ports' not in service_dict: return service_dict diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py index 3eaa97166..a758154c0 100644 --- a/tests/unit/config/config_test.py +++ b/tests/unit/config/config_test.py @@ -406,6 +406,32 @@ class ConfigTest(unittest.TestCase): } } + def test_load_config_service_labels(self): + base_file = config.ConfigFile( + 'base.yaml', + { + 'version': '2.1', + 'services': { + 'web': { + 'image': 'example/web', + 'labels': ['label_key=label_val'] + }, + 'db': { + 'image': 'example/db', + 'labels': { + 'label_key': 'label_val' + } + } + }, + } + ) + details = config.ConfigDetails('.', [base_file]) + service_dicts = config.load(details).services + for service in service_dicts: + assert service['labels'] == { + 'label_key': 'label_val' + } + def test_load_config_volume_and_network_labels(self): base_file = config.ConfigFile( 'base.yaml', @@ -434,30 +460,23 @@ class ConfigTest(unittest.TestCase): ) details = config.ConfigDetails('.', [base_file]) - network_dict = config.load(details).networks - volume_dict = config.load(details).volumes + loaded_config = config.load(details) - self.assertEqual( - network_dict, - { - 'with_label': { - 'labels': { - 'label_key': 'label_val' - } + assert loaded_config.networks == { + 'with_label': { + 'labels': { + 'label_key': 'label_val' } } - ) + } - self.assertEqual( - volume_dict, - { - 'with_label': { - 'labels': { - 'label_key': 'label_val' - } + assert loaded_config.volumes == { + 'with_label': { + 'labels': { + 'label_key': 'label_val' } } - ) + } def test_load_config_invalid_service_names(self): for invalid_name in ['?not?allowed', ' ', '', '!', '/', '\xe2']: