Skip to content

Commit e08eeda

Browse files
committed
fix: preserve Docker runner exit status
Signed-off-by: Zakhar Dvurechensky <72825626+Zakharden@users.noreply.github.com>
1 parent 504d779 commit e08eeda

2 files changed

Lines changed: 26 additions & 14 deletions

File tree

sdk/python/kfp/local/docker_task_handler.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,21 +140,16 @@ def run_docker_container(client: 'docker.DockerClient', image: str,
140140
stdout=True,
141141
stderr=True,
142142
volumes=volumes,
143-
auto_remove=True,
143+
auto_remove=False,
144144
**container_run_args)
145145
try:
146146
for line in container.logs(stream=True):
147147
# the inner logs should already have trailing \n
148148
# we do not need to add another
149149
print(line.decode(), end='')
150-
except docker.errors.NotFound:
151-
# Container was auto-removed before we could stream logs
152-
# This can happen if the container exits very quickly
153-
pass
154-
try:
155150
return container.wait()['StatusCode']
156-
except docker.errors.NotFound:
157-
# Container was auto-removed after logs completed
158-
# This means the container exited successfully (logs streaming completed)
159-
# We assume success since we couldn't get the actual status code
160-
return 0
151+
finally:
152+
try:
153+
container.remove(force=True)
154+
except docker.errors.NotFound:
155+
pass

sdk/python/kfp/local/docker_task_handler_test.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_no_volumes(self):
6666
stdout=True,
6767
stderr=True,
6868
volumes={},
69-
auto_remove=True,
69+
auto_remove=False,
7070
)
7171

7272
def test_cwd_volume(self):
@@ -90,8 +90,25 @@ def test_cwd_volume(self):
9090
'bind': '/localdir',
9191
'mode': 'ro'
9292
}},
93-
auto_remove=True,
93+
auto_remove=False,
9494
)
95+
self.mocked_docker_client.containers.run.return_value.remove.assert_called_once_with(
96+
force=True)
97+
98+
def test_returns_container_exit_status_before_removing_container(self):
99+
mock_container = self.mocked_docker_client.containers.run.return_value
100+
mock_container.wait.return_value = {'StatusCode': 1}
101+
102+
return_code = docker_task_handler.run_docker_container(
103+
docker.from_env(),
104+
image='alpine',
105+
command=['false'],
106+
volumes={},
107+
)
108+
109+
self.assertEqual(return_code, 1)
110+
mock_container.wait.assert_called_once()
111+
mock_container.remove.assert_called_once_with(force=True)
95112

96113

97114
class TestDockerTaskHandler(DockerMockTestCase):
@@ -239,7 +256,7 @@ def test_run(self):
239256
'mode': 'rw'
240257
}
241258
},
242-
auto_remove=True,
259+
auto_remove=False,
243260
)
244261

245262
def test_run_passes_env_vars(self):

0 commit comments

Comments
 (0)