diff --git a/compose/config/config.py b/compose/config/config.py index 59c76680b..d9ee158d5 100644 --- a/compose/config/config.py +++ b/compose/config/config.py @@ -8,7 +8,7 @@ import os import string import sys from collections import namedtuple -from operator import itemgetter, attrgetter +from operator import attrgetter import six import yaml @@ -844,9 +844,9 @@ def finalize_service_volumes(service_dict, environment): duplicate_mounts.append(mount.repr()) if duplicate_mounts: - raise ConfigurationError("Duplicate mount points: volumes [%s]" % ( + raise ConfigurationError("Duplicate mount points: [%s]" % ( ', '.join(duplicate_mounts))) - + service_dict['volumes'] = finalized_volumes return service_dict diff --git a/compose/service.py b/compose/service.py index 964ab0193..f6dfa7c72 100644 --- a/compose/service.py +++ b/compose/service.py @@ -9,7 +9,6 @@ import sys from collections import namedtuple from collections import OrderedDict from operator import attrgetter -from operator import itemgetter import enum import six diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py index 787d8ff4a..f95c46d89 100644 --- a/tests/unit/config/config_test.py +++ b/tests/unit/config/config_test.py @@ -3071,6 +3071,41 @@ class ConfigTest(unittest.TestCase): ) config.load(config_details) + def test_config_duplicate_mount_points(self): + config1 = build_config_details( + { + 'version': '3.5', + 'services': { + 'web': { + 'image': 'busybox', + 'volumes': ['/tmp/foo:/tmp/foo', '/tmp/foo:/tmp/foo:rw'] + } + } + } + ) + + config2 = build_config_details( + { + 'version': '3.5', + 'services': { + 'web': { + 'image': 'busybox', + 'volumes': ['/x:/y', '/z:/y'] + } + } + } + ) + + with self.assertRaises(ConfigurationError) as e: + config.load(config1) + self.assertEquals(str(e.exception), 'Duplicate mount points: [%s]' % ( + ', '.join(['/tmp/foo:/tmp/foo:rw']*2))) + + with self.assertRaises(ConfigurationError) as e: + config.load(config2) + self.assertEquals(str(e.exception), 'Duplicate mount points: [%s]' % ( + ', '.join(['/x:/y:rw', '/z:/y:rw']))) + class NetworkModeTest(unittest.TestCase):