Browse Source

Add support for log-driver in docker-compose.yml

Closes #1303

Signed-off-by: Vincent Demeester <[email protected]>
Vincent Demeester 10 years ago
parent
commit
f626fc5ce8
5 changed files with 41 additions and 1 deletions
  1. 1 0
      compose/config.py
  2. 4 0
      compose/container.py
  3. 4 1
      compose/service.py
  4. 14 0
      docs/yml.md
  5. 18 0
      tests/integration/service_test.py

+ 1 - 0
compose/config.py

@@ -23,6 +23,7 @@ DOCKER_CONFIG_KEYS = [
     'links',
     'mem_limit',
     'net',
+    'log_driver',
     'pid',
     'ports',
     'privileged',

+ 4 - 0
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:

+ 4 - 1
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
@@ -25,6 +25,7 @@ DOCKER_START_KEYS = [
     'env_file',
     'extra_hosts',
     'net',
+    'log_driver',
     'pid',
     'privileged',
     'restart',
@@ -429,6 +430,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)
@@ -455,6 +457,7 @@ class Service(object):
             restart_policy=restart,
             cap_add=cap_add,
             cap_drop=cap_drop,
+            log_config=log_config,
             extra_hosts=extra_hosts,
             pid_mode=pid
         )

+ 14 - 0
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.

+ 18 - 0
tests/integration/service_test.py

@@ -649,3 +649,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'])