浏览代码

Fix ports reparsing for service extends

Signed-off-by: Joffrey F <[email protected]>
Joffrey F 8 年之前
父节点
当前提交
a0add5cc12
共有 2 个文件被更改,包括 27 次插入1 次删除
  1. 4 0
      compose/config/types.py
  2. 23 1
      tests/unit/config/config_test.py

+ 4 - 0
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():

+ 23 - 1
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):