summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <f.joffrey@gmail.com>2018-01-26 14:35:45 -0800
committerGitHub <noreply@github.com>2018-01-26 14:35:45 -0800
commit84d454551cb55519c11ca222acc1afa32c8a3f8b (patch)
tree9355f80f59d6962a33aeb45c6b974e6a53eec5dc
parent04eb7a2a9934489bd4d7739b0ec2364e0e0ef593 (diff)
parent6e6eaece81ebeb43f644a14e498189a9d27d647e (diff)
downloaddocker-py-84d454551cb55519c11ca222acc1afa32c8a3f8b.tar.gz
Merge pull request #1872 from docker/hnq90-add_exit_code_to_exec_run
Also return exit code in exec_run
-rw-r--r--docker/models/containers.py18
-rw-r--r--tests/integration/models_containers_test.py15
-rw-r--r--tests/unit/models_containers_test.py13
3 files changed, 39 insertions, 7 deletions
diff --git a/docker/models/containers.py b/docker/models/containers.py
index bdc05cd..9644b00 100644
--- a/docker/models/containers.py
+++ b/docker/models/containers.py
@@ -150,10 +150,14 @@ class Container(Model):
workdir (str): Path to working directory for this exec session
Returns:
- (generator or str):
- If ``stream=True``, a generator yielding response chunks.
- If ``socket=True``, a socket object for the connection.
- A string containing response data otherwise.
+ (tuple): A tuple of (exit_code, output)
+ exit_code: (int):
+ Exit code for the executed command
+ output: (generator or str):
+ If ``stream=True``, a generator yielding response chunks.
+ If ``socket=True``, a socket object for the connection.
+ A string containing response data otherwise.
+
Raises:
:py:class:`docker.errors.APIError`
If the server returns an error.
@@ -163,9 +167,13 @@ class Container(Model):
privileged=privileged, user=user, environment=environment,
workdir=workdir
)
- return self.client.api.exec_start(
+ exec_output = self.client.api.exec_start(
resp['Id'], detach=detach, tty=tty, stream=stream, socket=socket
)
+ exit_code = 0
+ if stream is False:
+ exit_code = self.client.api.exec_inspect(resp['Id'])['ExitCode']
+ return (exit_code, exec_output)
def export(self):
"""
diff --git a/tests/integration/models_containers_test.py b/tests/integration/models_containers_test.py
index d246189..3c33cb0 100644
--- a/tests/integration/models_containers_test.py
+++ b/tests/integration/models_containers_test.py
@@ -182,13 +182,24 @@ class ContainerTest(BaseIntegrationTest):
container.wait()
assert container.diff() == [{'Path': '/test', 'Kind': 1}]
- def test_exec_run(self):
+ def test_exec_run_success(self):
client = docker.from_env(version=TEST_API_VERSION)
container = client.containers.run(
"alpine", "sh -c 'echo \"hello\" > /test; sleep 60'", detach=True
)
self.tmp_containers.append(container.id)
- assert container.exec_run("cat /test") == b"hello\n"
+ exec_output = container.exec_run("cat /test")
+ assert exec_output[0] == 0
+ assert exec_output[1] == b"hello\n"
+
+ def test_exec_run_failed(self):
+ client = docker.from_env(version=TEST_API_VERSION)
+ container = client.containers.run(
+ "alpine", "sh -c 'sleep 60'", detach=True
+ )
+ self.tmp_containers.append(container.id)
+ exec_output = container.exec_run("docker ps")
+ assert exec_output[0] == 126
def test_kill(self):
client = docker.from_env(version=TEST_API_VERSION)
diff --git a/tests/unit/models_containers_test.py b/tests/unit/models_containers_test.py
index 62a29b3..d7457ba 100644
--- a/tests/unit/models_containers_test.py
+++ b/tests/unit/models_containers_test.py
@@ -401,6 +401,19 @@ class ContainerTest(unittest.TestCase):
FAKE_EXEC_ID, detach=False, tty=False, stream=True, socket=False
)
+ def test_exec_run_failure(self):
+ client = make_fake_client()
+ container = client.containers.get(FAKE_CONTAINER_ID)
+ container.exec_run("docker ps", privileged=True, stream=False)
+ client.api.exec_create.assert_called_with(
+ FAKE_CONTAINER_ID, "docker ps", stdout=True, stderr=True,
+ stdin=False, tty=False, privileged=True, user='', environment=None,
+ workdir=None
+ )
+ client.api.exec_start.assert_called_with(
+ FAKE_EXEC_ID, detach=False, tty=False, stream=False, socket=False
+ )
+
def test_export(self):
client = make_fake_client()
container = client.containers.get(FAKE_CONTAINER_ID)