diff --git a/compose/config.py b/compose/config.py index 8ebcef010..3241bb80e 100644 --- a/compose/config.py +++ b/compose/config.py @@ -24,6 +24,7 @@ DOCKER_CONFIG_KEYS = [ 'links', 'mem_limit', 'net', + 'log_driver', 'pid', 'ports', 'privileged', diff --git a/compose/container.py b/compose/container.py index 9439a7087..fc3370d9e 100644 --- a/compose/container.py +++ b/compose/container.py @@ -83,6 +83,10 @@ class Container(object): def labels(self): return self.get('Config.Labels') or {} + @property + def log_config(self): + return self.get('HostConfig.LogConfig') or None + @property def human_readable_state(self): if self.is_running: diff --git a/compose/service.py b/compose/service.py index 6250e5351..ee47142f2 100644 --- a/compose/service.py +++ b/compose/service.py @@ -8,7 +8,7 @@ import sys import six from docker.errors import APIError -from docker.utils import create_host_config +from docker.utils import create_host_config, LogConfig from .config import DOCKER_CONFIG_KEYS from .container import Container, get_container_name @@ -26,6 +26,7 @@ DOCKER_START_KEYS = [ 'extra_hosts', 'read_only', 'net', + 'log_driver', 'pid', 'privileged', 'restart', @@ -430,6 +431,7 @@ class Service(object): privileged = options.get('privileged', False) cap_add = options.get('cap_add', None) cap_drop = options.get('cap_drop', None) + log_config = LogConfig(type=options.get('log_driver', 'json-file')) pid = options.get('pid', None) dns = options.get('dns', None) @@ -457,6 +459,7 @@ class Service(object): restart_policy=restart, cap_add=cap_add, cap_drop=cap_drop, + log_config=log_config, extra_hosts=extra_hosts, read_only=read_only, pid_mode=pid diff --git a/docs/yml.md b/docs/yml.md index 1e910d184..96a478bb2 100644 --- a/docs/yml.md +++ b/docs/yml.md @@ -271,6 +271,20 @@ labels: - "com.example.label-with-empty-value" ``` +### log driver + +Specify a logging driver for the service's containers, as with the ``--log-driver`` option for docker run ([documented here](http://docs.docker.com/reference/run/#logging-drivers-log-driver)). + +Allowed values are currently ``json-file``, ``syslog`` and ``none``. The list will change over time as more drivers are added to the Docker engine. + +The default value is json-file. + +``` +log_driver: "json-file" +log_driver: "syslog" +log_driver: "none" +``` + ### net Networking mode. Use the same values as the docker client `--net` parameter. diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py index edda71dec..678aacdd0 100644 --- a/tests/integration/service_test.py +++ b/tests/integration/service_test.py @@ -656,3 +656,21 @@ class ServiceTest(DockerClientTestCase): labels = create_and_start_container(service).labels.items() for name in labels_list: self.assertIn((name, ''), labels) + + def test_log_drive_invalid(self): + service = self.create_service('web', log_driver='xxx') + self.assertRaises(ValueError, lambda: create_and_start_container(service)) + + def test_log_drive_empty_default_jsonfile(self): + service = self.create_service('web') + log_config = create_and_start_container(service).log_config + + self.assertEqual('json-file', log_config['Type']) + self.assertFalse(log_config['Config']) + + def test_log_drive_none(self): + service = self.create_service('web', log_driver='none') + log_config = create_and_start_container(service).log_config + + self.assertEqual('none', log_config['Type']) + self.assertFalse(log_config['Config'])