diff --git a/docs/django.md b/docs/django.md index 8ecb3641e..c85eb5070 100644 --- a/docs/django.md +++ b/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 diff --git a/docs/wordpress.md b/docs/wordpress.md index a2f1bcf4a..5eff34879 100644 --- a/docs/wordpress.md +++ b/docs/wordpress.md @@ -33,8 +33,6 @@ web: - .:/code db: image: orchardup/mysql - ports: - - "3306:3306" environment: MYSQL_DATABASE: wordpress ``` diff --git a/docs/yml.md b/docs/yml.md index df462b17b..24484d4f6 100644 --- a/docs/yml.md +++ b/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 diff --git a/fig/container.py b/fig/container.py index 0a118af64..c926d2a96 100644 --- a/fig/container.py +++ b/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 diff --git a/fig/service.py b/fig/service.py index d07f80d1b..cfc393676 100644 --- a/fig/service.py +++ b/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] diff --git a/tests/service_test.py b/tests/service_test.py index 63a31df56..3448596dc 100644 --- a/tests/service_test.py +++ b/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')