Browse Source

Merge pull request #143 from orchardup/expose-option

Support 'expose' config option, like docker's --expose
Ben Firshman 11 years ago
parent
commit
a058c40dfb
6 changed files with 24 additions and 14 deletions
  1. 0 2
      docs/django.md
  2. 0 2
      docs/wordpress.md
  3. 6 0
      docs/yml.md
  4. 2 0
      fig/container.py
  5. 4 3
      fig/service.py
  6. 12 7
      tests/service_test.py

+ 0 - 2
docs/django.md

@@ -28,8 +28,6 @@ Simple enough. Finally, this is all tied together with a file called `fig.yml`.
 
     db:
       image: orchardup/postgresql
-      ports:
-        - "5432"
     web:
       build: .
       command: python manage.py runserver 0.0.0.0:8000

+ 0 - 2
docs/wordpress.md

@@ -33,8 +33,6 @@ web:
     - .:/code
 db:
   image: orchardup/mysql
-  ports:
-    - "3306:3306"
   environment:
     MYSQL_DATABASE: wordpress
 ```

+ 6 - 0
docs/yml.md

@@ -44,6 +44,12 @@ ports:
  - "8000:8000"
  - "49100:22"
 
+-- Expose ports without publishing them to the host machine - they'll only be
+-- accessible to linked services. Only the internal port can be specified.
+expose:
+ - "3000"
+ - "8000"
+
 -- Map volumes from the host machine (HOST:CONTAINER).
 volumes:
  - cache/:/tmp/cache

+ 2 - 0
fig/container.py

@@ -70,6 +70,8 @@ class Container(object):
         for private, public in list(self.dictionary['NetworkSettings']['Ports'].items()):
             if public:
                 ports.append('%s->%s' % (public[0]['HostPort'], private))
+            else:
+                ports.append(private)
         return ', '.join(ports)
 
     @property

+ 4 - 3
fig/service.py

@@ -39,7 +39,7 @@ class Service(object):
         if 'image' in options and 'build' in options:
             raise ConfigError('Service %s has both an image and build path specified. A service can either be built to image or use an existing image, not both.' % name)
 
-        supported_options = DOCKER_CONFIG_KEYS + ['build']
+        supported_options = DOCKER_CONFIG_KEYS + ['build', 'expose']
 
         for k in options:
             if k not in supported_options:
@@ -246,9 +246,10 @@ class Service(object):
 
         container_options['name'] = self.next_container_name(one_off)
 
-        if 'ports' in container_options:
+        if 'ports' in container_options or 'expose' in self.options:
             ports = []
-            for port in container_options['ports']:
+            all_ports = container_options.get('ports', []) + self.options.get('expose', [])
+            for port in all_ports:
                 port = str(port)
                 if ':' in port:
                     port = port.split(':')[-1]

+ 12 - 7
tests/service_test.py

@@ -209,25 +209,30 @@ class ServiceTest(DockerClientTestCase):
     def test_start_container_creates_ports(self):
         service = self.create_service('web', ports=[8000])
         container = service.start_container().inspect()
-        self.assertEqual(list(container['HostConfig']['PortBindings'].keys()), ['8000/tcp'])
-        self.assertNotEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')
+        self.assertEqual(list(container['NetworkSettings']['Ports'].keys()), ['8000/tcp'])
+        self.assertNotEqual(container['NetworkSettings']['Ports']['8000/tcp'][0]['HostPort'], '8000')
+
+    def test_expose_does_not_publish_ports(self):
+        service = self.create_service('web', expose=[8000])
+        container = service.start_container().inspect()
+        self.assertEqual(container['NetworkSettings']['Ports'], {'8000/tcp': None})
 
     def test_start_container_creates_port_with_explicit_protocol(self):
         service = self.create_service('web', ports=['8000/udp'])
         container = service.start_container().inspect()
-        self.assertEqual(list(container['HostConfig']['PortBindings'].keys()), ['8000/udp'])
+        self.assertEqual(list(container['NetworkSettings']['Ports'].keys()), ['8000/udp'])
 
     def test_start_container_creates_fixed_external_ports(self):
         service = self.create_service('web', ports=['8000:8000'])
         container = service.start_container().inspect()
-        self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
-        self.assertEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8000')
+        self.assertIn('8000/tcp', container['NetworkSettings']['Ports'])
+        self.assertEqual(container['NetworkSettings']['Ports']['8000/tcp'][0]['HostPort'], '8000')
 
     def test_start_container_creates_fixed_external_ports_when_it_is_different_to_internal_port(self):
         service = self.create_service('web', ports=['8001:8000'])
         container = service.start_container().inspect()
-        self.assertIn('8000/tcp', container['HostConfig']['PortBindings'])
-        self.assertEqual(container['HostConfig']['PortBindings']['8000/tcp'][0]['HostPort'], '8001')
+        self.assertIn('8000/tcp', container['NetworkSettings']['Ports'])
+        self.assertEqual(container['NetworkSettings']['Ports']['8000/tcp'][0]['HostPort'], '8001')
 
     def test_scale(self):
         service = self.create_service('web')