Skip to content

Commit d81a487

Browse files
PanaetiusRalf Grubenmann
andauthored
fix(cli): check for image in registry before pulling and improve error messages (#3265)
Co-authored-by: Ralf Grubenmann <[email protected]>
1 parent 8f6e576 commit d81a487

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

renku/core/session/docker.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from uuid import uuid4
2323

2424
import docker
25+
from requests.exceptions import ReadTimeout
2526

2627
from renku.core import errors
2728
from renku.core.config import get_value
@@ -77,16 +78,22 @@ def build_image(self, image_descriptor: Path, image_name: str, config: Optional[
7778

7879
def find_image(self, image_name: str, config: Optional[Dict[str, Any]]) -> bool:
7980
"""Find the given container image."""
80-
try:
81-
self.docker_client().images.get(image_name)
82-
except docker.errors.ImageNotFound:
81+
with communication.busy(msg=f"Checking for image {image_name}"):
8382
try:
84-
with communication.busy(msg=f"Pulling image from remote {image_name}"):
85-
self.docker_client().images.pull(image_name)
86-
except docker.errors.NotFound:
87-
return False
83+
self.docker_client().images.get(image_name)
84+
except docker.errors.ImageNotFound:
85+
try:
86+
self.docker_client().images.get_registry_data(image_name)
87+
except docker.errors.NotFound:
88+
return False
8889
else:
8990
return True
91+
92+
try:
93+
with communication.busy(msg=f"Pulling image from remote {image_name}"):
94+
self.docker_client().images.pull(image_name)
95+
except docker.errors.NotFound:
96+
return False
9097
else:
9198
return True
9299

@@ -208,8 +215,14 @@ def session_start(
208215
message = f"The session for '{image_name}' has been successfully started. It is available at:\n\t"
209216
message += "\n\t".join(jupyter_urls)
210217
return message
211-
except (docker.errors.APIError, docker.errors.BuildError) as error:
212-
raise errors.DockerError(str(error))
218+
except docker.errors.BuildError as error:
219+
raise errors.DockerError("Couldn't build the image. See inner exception for details.") from error
220+
except docker.errors.APIError as error:
221+
raise errors.DockerError("Docker API returned an error. See inner exception for details.") from error
222+
except ReadTimeout as error:
223+
raise errors.DockerError(
224+
"Couldn't reach the Docker API. Is the docker service running and up to date?"
225+
) from error
213226

214227
def session_stop(self, project_name: str, session_name: Optional[str], stop_all: bool) -> bool:
215228
"""Stops all or a given interactive session."""

0 commit comments

Comments
 (0)