diff options
author | Joffrey F <f.joffrey@gmail.com> | 2018-01-26 14:35:45 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-26 14:35:45 -0800 |
commit | 84d454551cb55519c11ca222acc1afa32c8a3f8b (patch) | |
tree | 9355f80f59d6962a33aeb45c6b974e6a53eec5dc | |
parent | 04eb7a2a9934489bd4d7739b0ec2364e0e0ef593 (diff) | |
parent | 6e6eaece81ebeb43f644a14e498189a9d27d647e (diff) | |
download | docker-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.py | 18 | ||||
-rw-r--r-- | tests/integration/models_containers_test.py | 15 | ||||
-rw-r--r-- | tests/unit/models_containers_test.py | 13 |
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) |