@@ -171,29 +171,44 @@ def get_image(
171
171
cache_folder = create_tmp_dir (tmp_outdir_prefix )
172
172
173
173
absolute_path = os .path .abspath (cache_folder )
174
- dockerfile_path = os .path .join (absolute_path , "Dockerfile" )
175
- singularityfile_path = dockerfile_path + ".def"
176
- # if you do not set APPTAINER_TMPDIR will crash
177
- # WARNING: 'nodev' mount option set on /tmp, it could be a
178
- # source of failure during build process
179
- # FATAL: Unable to create build: 'noexec' mount option set on
180
- # /tmp, temporary root filesystem won't be usable at this location
181
- with open (dockerfile_path , "w" ) as dfile :
182
- dfile .write (dockerRequirement ["dockerFile" ])
183
-
184
- singularityfile = SingularityWriter (DockerParser (dockerfile_path ).parse ()).convert ()
185
- with open (singularityfile_path , "w" ) as file :
186
- file .write (singularityfile )
187
-
188
- os .environ ["APPTAINER_TMPDIR" ] = absolute_path
189
- singularity_options = ["--fakeroot" ] if not shutil .which ("proot" ) else []
190
- Client .build (
191
- recipe = singularityfile_path ,
192
- build_folder = absolute_path ,
193
- sudo = False ,
194
- options = singularity_options ,
195
- )
196
- found = True
174
+ if "dockerImageId" in dockerRequirement :
175
+ image_name = dockerRequirement ["dockerImageId" ]
176
+ image_path = os .path .join (absolute_path , image_name )
177
+ if os .path .exists (image_path ):
178
+ found = True
179
+ if found is False :
180
+ dockerfile_path = os .path .join (absolute_path , "Dockerfile" )
181
+ singularityfile_path = dockerfile_path + ".def"
182
+ # if you do not set APPTAINER_TMPDIR will crash
183
+ # WARNING: 'nodev' mount option set on /tmp, it could be a
184
+ # source of failure during build process
185
+ # FATAL: Unable to create build: 'noexec' mount option set on
186
+ # /tmp, temporary root filesystem won't be usable at this location
187
+ with open (dockerfile_path , "w" ) as dfile :
188
+ dfile .write (dockerRequirement ["dockerFile" ])
189
+
190
+ singularityfile = SingularityWriter (DockerParser (dockerfile_path ).parse ()).convert ()
191
+ with open (singularityfile_path , "w" ) as file :
192
+ file .write (singularityfile )
193
+
194
+ os .environ ["APPTAINER_TMPDIR" ] = absolute_path
195
+ singularity_options = ["--fakeroot" ] if not shutil .which ("proot" ) else []
196
+ if "dockerImageId" in dockerRequirement :
197
+ Client .build (
198
+ recipe = singularityfile_path ,
199
+ build_folder = absolute_path ,
200
+ image = dockerRequirement ["dockerImageId" ],
201
+ sudo = False ,
202
+ options = singularity_options ,
203
+ )
204
+ else :
205
+ Client .build (
206
+ recipe = singularityfile_path ,
207
+ build_folder = absolute_path ,
208
+ sudo = False ,
209
+ options = singularity_options ,
210
+ )
211
+ found = True
197
212
elif "dockerImageId" not in dockerRequirement and "dockerPull" in dockerRequirement :
198
213
match = re .search (pattern = r"([a-z]*://)" , string = dockerRequirement ["dockerPull" ])
199
214
img_name = _normalize_image_id (dockerRequirement ["dockerPull" ])
@@ -326,7 +341,13 @@ def get_from_requirements(
326
341
if not self .get_image (cast (Dict [str , str ], r ), pull_image , tmp_outdir_prefix , force_pull ):
327
342
raise WorkflowException ("Container image {} not found" .format (r ["dockerImageId" ]))
328
343
329
- return os .path .abspath (cast (str , r ["dockerImageId" ]))
344
+ if "CWL_SINGULARITY_CACHE" in os .environ :
345
+ cache_folder = os .environ ["CWL_SINGULARITY_CACHE" ]
346
+ img_path = os .path .join (cache_folder , cast (str , r ["dockerImageId" ]))
347
+ else :
348
+ img_path = cast (str , r ["dockerImageId" ])
349
+
350
+ return os .path .abspath (img_path )
330
351
331
352
@staticmethod
332
353
def append_volume (runtime : List [str ], source : str , target : str , writable : bool = False ) -> None :
0 commit comments