1616
1717
1818class ImagePuller (ABC ):
19- def __init__ (self , req : str , save_directory : Union [str , Path ], cmd : str ) -> None :
19+ def __init__ (
20+ self , req : str , save_directory : Union [str , Path ], cmd : str , force_pull : bool
21+ ) -> None :
2022 """Create an ImagePuller."""
2123 self .req = req
2224 self .save_directory = save_directory
2325 self .cmd = cmd
26+ self .force_pull = force_pull
2427
2528 @abstractmethod
2629 def get_image_name (self ) -> str :
@@ -62,17 +65,18 @@ def save_docker_image(self) -> None:
6265 _LOGGER .info (f"Pulling { self .req } with Docker..." )
6366 cmd_pull = [self .cmd , "pull" , self .req ]
6467 ImagePuller ._run_command_pull (cmd_pull )
68+ dest = os .path .join (self .save_directory , self .get_image_name ())
69+ if self .force_pull :
70+ os .remove (dest )
6571 cmd_save = [
6672 self .cmd ,
6773 "save" ,
6874 "-o" ,
69- os . path . join ( self . save_directory , self . get_image_name ()) ,
75+ dest ,
7076 self .req ,
7177 ]
7278 subprocess .run (cmd_save , check = True ) # nosec
73- _LOGGER .info (
74- f"Image successfully pulled: { self .save_directory } /{ self .get_image_name ()} "
75- )
79+ _LOGGER .info (f"Image successfully pulled: { dest !r} ." )
7680 print (self .generate_udocker_loading_command ())
7781
7882
@@ -98,15 +102,27 @@ def get_image_name(self) -> str:
98102 return f"{ image_name } { suffix } "
99103
100104 def save_docker_image (self ) -> None :
101- """Pull down the Docker container image in the Singularity image format."""
105+ """Pull down the Docker software container image and save it in the Singularity image format."""
106+ if (
107+ os .path .exists (os .path .join (self .save_directory , self .get_image_name ()))
108+ and not self .force_pull
109+ ):
110+ _LOGGER .info (f"Already cached { self .req } with Singularity." )
111+ return
102112 _LOGGER .info (f"Pulling { self .req } with Singularity..." )
103113 cmd_pull = [
104114 self .cmd ,
105115 "pull" ,
106- "--name" ,
107- os .path .join (self .save_directory , self .get_image_name ()),
108- f"docker://{ self .req } " ,
109116 ]
117+ if self .force_pull :
118+ cmd_pull .append ("--force" )
119+ cmd_pull .extend (
120+ [
121+ "--name" ,
122+ os .path .join (self .save_directory , self .get_image_name ()),
123+ f"docker://{ self .req } " ,
124+ ]
125+ )
110126 ImagePuller ._run_command_pull (cmd_pull )
111127 _LOGGER .info (
112128 f"Image successfully pulled: { self .save_directory } /{ self .get_image_name ()} "
0 commit comments