From 6b8044e92c875d04af27c6502e4307c13b39c6e0 Mon Sep 17 00:00:00 2001 From: j0hnsmith <info@whywouldwe.com> Date: Thu, 19 Jun 2014 11:57:55 +0100 Subject: [PATCH] add net param support Signed-off-by: Peter Flood <info@whywouldwe.com> --- docs/yml.md | 2 ++ fig/packages/docker/client.py | 5 ++++- fig/service.py | 8 +++++++- tests/integration/service_test.py | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/yml.md b/docs/yml.md index 24484d4f6..5a5a2af63 100644 --- a/docs/yml.md +++ b/docs/yml.md @@ -59,3 +59,5 @@ environment: RACK_ENV: development ``` +-- Networking mode. Use the same values as the docker client --net parameter +net: "host" diff --git a/fig/packages/docker/client.py b/fig/packages/docker/client.py index 7f00b4c45..79505c416 100644 --- a/fig/packages/docker/client.py +++ b/fig/packages/docker/client.py @@ -679,7 +679,7 @@ class Client(requests.Session): True) def start(self, container, binds=None, volumes_from=None, port_bindings=None, - lxc_conf=None, publish_all_ports=False, links=None, privileged=False): + lxc_conf=None, publish_all_ports=False, links=None, privileged=False, network_mode=None): if isinstance(container, dict): container = container.get('Id') @@ -726,6 +726,9 @@ class Client(requests.Session): start_config['Privileged'] = privileged + if network_mode: + start_config['NetworkMode'] = network_mode + url = self._url("/containers/{0}/start".format(container)) res = self._post_json(url, data=start_config) self._raise_for_status(res) diff --git a/fig/service.py b/fig/service.py index 2fc7125d0..d6f44cfda 100644 --- a/fig/service.py +++ b/fig/service.py @@ -11,7 +11,7 @@ from .progress_stream import stream_output, StreamOutputError log = logging.getLogger(__name__) -DOCKER_CONFIG_KEYS = ['image', 'command', 'hostname', 'user', 'detach', 'stdin_open', 'tty', 'mem_limit', 'ports', 'environment', 'dns', 'volumes', 'volumes_from', 'entrypoint', 'privileged'] +DOCKER_CONFIG_KEYS = ['image', 'command', 'hostname', 'user', 'detach', 'stdin_open', 'tty', 'mem_limit', 'ports', 'environment', 'dns', 'volumes', 'volumes_from', 'entrypoint', 'privileged', 'net'] DOCKER_CONFIG_HINTS = { 'link' : 'links', 'port' : 'ports', @@ -229,6 +229,7 @@ class Service(object): } privileged = options.get('privileged', False) + net = options.get('net', 'bridge') container.start( links=self._get_links(link_to_self=override_options.get('one_off', False)), @@ -236,6 +237,7 @@ class Service(object): binds=volume_bindings, volumes_from=volumes_from, privileged=privileged, + network_mode=net, ) return container @@ -297,6 +299,10 @@ class Service(object): if 'privileged' in container_options: del container_options['privileged'] + # net is only required for starting containers, not for creating them + if 'net' in container_options: + del container_options['net'] + return container_options def build(self): diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index 78ddbd850..aaefbd403 100644 --- a/tests/integration/service_test.py +++ b/tests/integration/service_test.py @@ -253,3 +253,18 @@ class ServiceTest(DockerClientTestCase): self.assertEqual(len(containers), 2) for container in containers: self.assertEqual(list(container.inspect()['HostConfig']['PortBindings'].keys()), ['8000/tcp']) + + def test_network_mode_none(self): + service = self.create_service('web', net='none') + container = service.start_container().inspect() + self.assertEqual(container['HostConfig']['NetworkMode'], 'none') + + def test_network_mode_bridged(self): + service = self.create_service('web', net='bridge') + container = service.start_container().inspect() + self.assertEqual(container['HostConfig']['NetworkMode'], 'bridge') + + def test_network_mode_host(self): + service = self.create_service('web', net='host') + container = service.start_container().inspect() + self.assertEqual(container['HostConfig']['NetworkMode'], 'host')