소스 검색

Add support for specifying external port

Ben Firshman 12 년 전
부모
커밋
87c46e281c
3개의 변경된 파일25개의 추가작업 그리고 4개의 파일을 삭제
  1. 0 1
      plum/cli/main.py
  2. 10 2
      plum/service.py
  3. 15 1
      tests/service_test.py

+ 0 - 1
plum/cli/main.py

@@ -92,7 +92,6 @@ class TopLevelCommand(Command):
         }
         container = service.create_container(**container_options)
         stream = self.client.logs(container, stream=True)
-        service.start_container(container, **container_options)
         for data in stream:
             if data is None:
                 break

+ 10 - 2
plum/service.py

@@ -42,8 +42,13 @@ class Service(object):
         if container is None:
             container = self.create_container(**override_options)
         port_bindings = {}
-        for port in container_options.get('ports', []):
-            port_bindings[port] = None
+        for port in self.options.get('ports', []):
+            port = unicode(port)
+            if ':' in port:
+                internal_port, external_port = port.split(':', 1)
+                port_bindings[int(internal_port)] = int(external_port)
+            else:
+                port_bindings[int(port)] = None
         self.client.start(
             container['Id'],
             links=self._get_links(),
@@ -85,6 +90,9 @@ class Service(object):
         number = self.next_container_number()
         container_options['name'] = make_name(self.name, number)
 
+        if 'ports' in container_options:
+            container_options['ports'] = [unicode(p).split(':')[0] for p in container_options['ports']]
+
         if 'build' in self.options:
             log.info('Building %s from %s...' % (self.name, self.options['build']))
             container_options['image'] = self.client.build(self.options['build'])[0]

+ 15 - 1
tests/service_test.py

@@ -87,5 +87,19 @@ class NameTestCase(DockerClientTestCase):
         container = service.start()
         self.client.wait(container)
         self.assertIn('success', self.client.logs(container))
-        
+
+    def test_start_container_creates_ports(self):
+        service = self.create_service('web', ports=[8000])
+        service.start_container()
+        container = service.inspect()[0]
+        self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
+        self.assertNotEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')
+
+    def test_start_container_creates_fixed_external_ports(self):
+        service = self.create_service('web', ports=['8000:8000'])
+        service.start_container()
+        container = service.inspect()[0]
+        self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
+        self.assertEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')
+