瀏覽代碼

add support for stop_signal to compose file

Signed-off-by: Jonathan Stewmon <[email protected]>
Jonathan Stewmon 10 年之前
父節點
當前提交
5d8c2d3cec

+ 1 - 0
compose/config/config.py

@@ -62,6 +62,7 @@ DOCKER_CONFIG_KEYS = [
     'restart',
     'security_opt',
     'stdin_open',
+    'stop_signal',
     'tty',
     'user',
     'volume_driver',

+ 1 - 0
compose/config/service_schema_v1.json

@@ -94,6 +94,7 @@
         "restart": {"type": "string"},
         "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
         "stdin_open": {"type": "boolean"},
+        "stop_signal": {"type": "string"},
         "tty": {"type": "boolean"},
         "ulimits": {
           "type": "object",

+ 1 - 0
compose/config/service_schema_v2.json

@@ -101,6 +101,7 @@
         "restart": {"type": "string"},
         "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
         "stdin_open": {"type": "boolean"},
+        "stop_signal": {"type": "string"},
         "tty": {"type": "boolean"},
         "ulimits": {
           "type": "object",

+ 8 - 0
compose/container.py

@@ -107,6 +107,10 @@ class Container(object):
     def labels(self):
         return self.get('Config.Labels') or {}
 
+    @property
+    def stop_signal(self):
+        return self.get('Config.StopSignal')
+
     @property
     def log_config(self):
         return self.get('HostConfig.LogConfig') or None
@@ -132,6 +136,10 @@ class Container(object):
     def environment(self):
         return dict(var.split("=", 1) for var in self.get('Config.Env') or [])
 
+    @property
+    def exit_code(self):
+        return self.get('State.ExitCode')
+
     @property
     def is_running(self):
         return self.get('State.Running')

+ 12 - 0
tests/acceptance/cli_test.py

@@ -717,6 +717,18 @@ class CLITestCase(DockerClientTestCase):
         self.assertEqual(len(service.containers(stopped=True)), 1)
         self.assertFalse(service.containers(stopped=True)[0].is_running)
 
+    def test_stop_signal(self):
+        self.base_dir = 'tests/fixtures/stop-signal-composefile'
+        self.dispatch(['up', '-d'], None)
+        service = self.project.get_service('simple')
+        self.assertEqual(len(service.containers()), 1)
+        self.assertTrue(service.containers()[0].is_running)
+
+        self.dispatch(['stop', '-t', '1'], None)
+        self.assertEqual(len(service.containers(stopped=True)), 1)
+        self.assertFalse(service.containers(stopped=True)[0].is_running)
+        self.assertEqual(service.containers(stopped=True)[0].exit_code, 0)
+
     def test_start_no_containers(self):
         result = self.dispatch(['start'], returncode=1)
         assert 'No containers to start' in result.stderr

+ 10 - 0
tests/fixtures/stop-signal-composefile/docker-compose.yml

@@ -0,0 +1,10 @@
+simple:
+  image: busybox:latest
+  command:
+    - sh
+    - '-c'
+    - |
+        trap 'exit 0' SIGINT
+        trap 'exit 1' SIGTERM
+        while true; do :; done
+  stop_signal: SIGINT

+ 6 - 0
tests/integration/service_test.py

@@ -887,6 +887,12 @@ class ServiceTest(DockerClientTestCase):
         for name in labels_dict:
             self.assertIn((name, ''), labels)
 
+    def test_stop_signal(self):
+        stop_signal = 'SIGINT'
+        service = self.create_service('web', stop_signal=stop_signal)
+        container = create_and_start_container(service)
+        self.assertEqual(container.stop_signal, stop_signal)
+
     def test_custom_container_name(self):
         service = self.create_service('web', container_name='my-web-container')
         self.assertEqual(service.custom_container_name(), 'my-web-container')