summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Hensley <spaceboy@indirect.com>2014-10-17 16:06:01 -0400
committerPatrick Hensley <spaceboy@indirect.com>2014-10-17 16:06:01 -0400
commitfce477243efb8e33bf1fba0a7e40f3256eae9963 (patch)
tree5354da8786f4f531e9c0cc4fdedb45bd6e673618
parentd26428b6332cb983db2397c7d627192fac8c1f17 (diff)
downloaddocker-py-fce477243efb8e33bf1fba0a7e40f3256eae9963.tar.gz
Implemented exec command.
-rw-r--r--docker/client.py43
1 files changed, 42 insertions, 1 deletions
diff --git a/docker/client.py b/docker/client.py
index 4ff91d8..d9bee96 100644
--- a/docker/client.py
+++ b/docker/client.py
@@ -34,7 +34,7 @@ from .tls import TLSConfig
if not six.PY3:
import websocket
-DEFAULT_DOCKER_API_VERSION = '1.12'
+DEFAULT_DOCKER_API_VERSION = '1.15'
DEFAULT_TIMEOUT_SECONDS = 60
STREAM_HEADER_SIZE_BYTES = 8
@@ -542,6 +542,47 @@ class Client(requests.Session):
def events(self):
return self._stream_helper(self.get(self._url('/events'), stream=True))
+ def execute(self, container, cmd, detach=False, stdout=True, stderr=True,
+ stream=False, tty=False):
+ if utils.compare_version('1.15', self._version) < 0:
+ raise Exception('Exec is not supported in API < 1.15!')
+ if isinstance(container, dict):
+ container = container.get('Id')
+ if not isinstance(cmd, (list, tuple)):
+ cmd = [cmd]
+
+ data = {
+ 'Container': container,
+ 'User': '',
+ 'Privileged': False,
+ 'Tty': tty,
+ 'AttachStdin': False,
+ 'AttachStdout': stdout,
+ 'AttachStderr': stderr,
+ 'Detach': detach,
+ 'Cmd': cmd
+ }
+
+ # create the command
+ res = self._post_json(self._url('/containers/shell/exec'), data=data)
+ self._raise_for_status(res)
+
+ # start the command
+ cmd_id = res.json().get('Id')
+ res = self._post_json(self._url('/exec/{0}/start'.format(cmd_id)), data=data,
+ stream=stream)
+ self._raise_for_status(res)
+ if stream:
+ return self._multiplexed_socket_stream_helper(res)
+ elif six.PY3:
+ return bytes().join(
+ [x for x in self._multiplexed_buffer_helper(res)]
+ )
+ else:
+ return str().join(
+ [x for x in self._multiplexed_buffer_helper(res)]
+ )
+
def export(self, container):
if isinstance(container, dict):
container = container.get('Id')