diff --git a/compose/config/types.py b/compose/config/types.py index a8d366fba..96846b5ba 100644 --- a/compose/config/types.py +++ b/compose/config/types.py @@ -266,6 +266,10 @@ class ServicePort(namedtuple('_ServicePort', 'target published protocol mode ext @classmethod def parse(cls, spec): + if isinstance(spec, cls): + # WHen extending a service with ports, the port definitions have already been parsed + return [spec] + if not isinstance(spec, dict): result = [] for k, v in build_port_bindings([spec]).items(): diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py index 195efe3b9..4db87ecb6 100644 --- a/tests/unit/config/config_test.py +++ b/tests/unit/config/config_test.py @@ -3403,7 +3403,7 @@ class ExtendsTest(unittest.TestCase): self.assertEqual(service[0]['command'], "top") def test_extends_with_depends_on(self): - tmpdir = py.test.ensuretemp('test_extends_with_defined_version') + tmpdir = py.test.ensuretemp('test_extends_with_depends_on') self.addCleanup(tmpdir.remove) tmpdir.join('docker-compose.yml').write(""" version: "2" @@ -3435,6 +3435,28 @@ class ExtendsTest(unittest.TestCase): } }] + def test_extends_with_ports(self): + tmpdir = py.test.ensuretemp('test_extends_with_ports') + self.addCleanup(tmpdir.remove) + tmpdir.join('docker-compose.yml').write(""" + version: '2' + + services: + a: + image: nginx + ports: + - 80 + + b: + extends: + service: a + """) + services = load_from_filename(str(tmpdir.join('docker-compose.yml'))) + + assert len(services) == 2 + for svc in services: + assert svc['ports'] == [types.ServicePort('80', None, None, None, None)] + @pytest.mark.xfail(IS_WINDOWS_PLATFORM, reason='paths use slash') class ExpandPathTest(unittest.TestCase):