Skip to content

Commit 22e3d48

Browse files
DailyDreamingmr-c
authored andcommitted
Only bindmount basedirs.
1 parent b44af89 commit 22e3d48

File tree

5 files changed

+53
-30
lines changed

5 files changed

+53
-30
lines changed

cwltool/command_line_tool.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -877,8 +877,13 @@ def update_status_output_callback(
877877
)
878878
_logger.debug("[job %s] %s", j.name, json_dumps(builder.job, indent=4))
879879

880+
separateDirs = True
881+
# sufficient conditional for docker/singularity?
882+
if runtimeContext.use_container:
883+
separateDirs = False
884+
880885
builder.pathmapper = self.make_path_mapper(
881-
reffiles, builder.stagedir, runtimeContext, True
886+
reffiles, builder.stagedir, runtimeContext, separateDirs
882887
)
883888
builder.requirements = j.requirements
884889

cwltool/docker.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,9 @@ def append_volume(
251251
runtime: List[str], source: str, target: str, writable: bool = False
252252
) -> None:
253253
"""Add binding arguments to the runtime list."""
254+
if os.path.isfile(source) and target.endswith(os.path.basename(source)) and not writable:
255+
source = os.path.dirname(source)
256+
target = os.path.dirname(target)
254257
options = [
255258
"type=bind",
256259
"source=" + source,
@@ -260,8 +263,9 @@ def append_volume(
260263
options.append("readonly")
261264
output = StringIO()
262265
csv.writer(output).writerow(options)
263-
mount_arg = output.getvalue().strip()
264-
runtime.append("--mount={}".format(mount_arg))
266+
mount_arg = f"--mount={output.getvalue().strip()}"
267+
if mount_arg not in runtime:
268+
runtime.append(mount_arg)
265269
# Unlike "--volume", "--mount" will fail if the volume doesn't already exist.
266270
if not os.path.exists(source):
267271
os.makedirs(source)

cwltool/job.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -681,10 +681,34 @@ def add_volumes(
681681
any_path_okay: bool = False,
682682
) -> None:
683683
"""Append volume mappings to the runtime option list."""
684-
staging_dir = tempfile.mkdtemp()
685-
pathmapper.reset_stagedir(staging_dir)
686-
stage_files(pathmapper, symlink=False)
687-
self.append_volume(runtime, staging_dir, staging_dir)
684+
container_outdir = self.builder.outdir
685+
for key, vol in (itm for itm in pathmapper.items() if itm[1].staged):
686+
host_outdir_tgt = None # type: Optional[str]
687+
if vol.target.startswith(container_outdir + "/"):
688+
host_outdir_tgt = os.path.join(
689+
self.outdir, vol.target[len(container_outdir) + 1 :]
690+
)
691+
if not host_outdir_tgt and not any_path_okay:
692+
raise WorkflowException(
693+
"No mandatory DockerRequirement, yet path is outside "
694+
"the designated output directory, also know as "
695+
"$(runtime.outdir): {}".format(vol)
696+
)
697+
if vol.type in ("File", "Directory"):
698+
self.add_file_or_directory_volume(runtime, vol, host_outdir_tgt)
699+
elif vol.type == "WritableFile":
700+
self.add_writable_file_volume(
701+
runtime, vol, host_outdir_tgt, tmpdir_prefix
702+
)
703+
elif vol.type == "WritableDirectory":
704+
self.add_writable_directory_volume(
705+
runtime, vol, host_outdir_tgt, tmpdir_prefix
706+
)
707+
elif vol.type in ["CreateFile", "CreateWritableFile"]:
708+
new_path = self.create_file_and_add_volume(
709+
runtime, vol, host_outdir_tgt, secret_store, tmpdir_prefix
710+
)
711+
pathmapper.update(key, new_path, vol.target, vol.type, vol.staged)
688712

689713
def run(
690714
self,

cwltool/pathmapper.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,10 @@ def __init__(
6464
separateDirs: bool = True,
6565
) -> None:
6666
"""Initialize the PathMapper."""
67-
self.referenced_files = dedup(referenced_files)
68-
self.basedir = basedir
6967
self._pathmap = {} # type: Dict[str, MapperEnt]
7068
self.stagedir = stagedir
7169
self.separateDirs = separateDirs
72-
self.setup(self.referenced_files, basedir)
73-
74-
def reset_stagedir(self, stagedir: str) -> None:
75-
"""Changes the target stagedir for mapped files."""
76-
self.stagedir = stagedir
77-
self._pathmap = {} # type: Dict[str, MapperEnt]
78-
self.setup(self.referenced_files, self.basedir)
70+
self.setup(dedup(referenced_files), basedir)
7971

8072
def visitlisting(
8173
self,

cwltool/singularity.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -280,16 +280,17 @@ def get_from_requirements(
280280

281281
@staticmethod
282282
def append_volume(
283-
runtime: List[str], source: str, target: str, writable: bool = False
283+
runtime: List[str], source: str, target: str, writable: bool = False
284284
) -> None:
285-
runtime.append("--bind")
286-
runtime.append(
287-
"{}:{}:{}".format(
288-
docker_windows_path_adjust(source),
289-
docker_windows_path_adjust(target),
290-
"rw" if writable else "ro",
291-
)
292-
)
285+
src = docker_windows_path_adjust(source)
286+
dst = docker_windows_path_adjust(target)
287+
writable = "rw" if writable else "ro"
288+
if os.path.isfile(src) and dst.endswith(os.path.basename(src)) and writable == 'ro':
289+
src = os.path.dirname(src)
290+
dst = os.path.dirname(dst)
291+
bind_arg = f"--bind={src}:{dst}:{writable}"
292+
if bind_arg not in runtime:
293+
runtime.append(bind_arg)
293294

294295
def add_file_or_directory_volume(
295296
self, runtime: List[str], volume: MapperEnt, host_outdir_tgt: Optional[str]
@@ -403,17 +404,14 @@ def create_runtime(
403404
)
404405
)
405406
else:
406-
runtime.append("--bind")
407-
runtime.append(
408-
"{}:{}:rw".format(
407+
runtime.append("--bind={}:{}:rw".format(
409408
docker_windows_path_adjust(os.path.realpath(self.outdir)),
410409
self.builder.outdir,
411410
)
412411
)
413-
runtime.append("--bind")
414412
tmpdir = "/tmp" # nosec
415413
runtime.append(
416-
"{}:{}:rw".format(
414+
"--bind={}:{}:rw".format(
417415
docker_windows_path_adjust(os.path.realpath(self.tmpdir)), tmpdir
418416
)
419417
)

0 commit comments

Comments
 (0)