diff options
| author | Patrick Hensley <spaceboy@indirect.com> | 2014-10-17 16:06:01 -0400 |
|---|---|---|
| committer | Patrick Hensley <spaceboy@indirect.com> | 2014-10-17 16:06:01 -0400 |
| commit | fce477243efb8e33bf1fba0a7e40f3256eae9963 (patch) | |
| tree | 5354da8786f4f531e9c0cc4fdedb45bd6e673618 | |
| parent | d26428b6332cb983db2397c7d627192fac8c1f17 (diff) | |
| download | docker-py-fce477243efb8e33bf1fba0a7e40f3256eae9963.tar.gz | |
Implemented exec command.
| -rw-r--r-- | docker/client.py | 43 |
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') |
