Skip to content

Commit

Permalink
Use "run" with singularity/apptainer instead of "exec", when possible
Browse files Browse the repository at this point in the history
Co-authored-by: Michael R. Crusoe <[email protected]>
  • Loading branch information
sameeul and mr-c committed Nov 12, 2024
1 parent 048eb55 commit 1557c8d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
20 changes: 19 additions & 1 deletion cwltool/singularity.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,14 @@ def is_apptainer_1_or_newer() -> bool:
return v[0][0] >= 1


def is_apptainer_1_1_or_newer() -> bool:
"""Check if apptainer singularity distribution is version 1.1 or higher."""
v = get_version()
if v[1] != "apptainer":
return False
return v[0][0] >= 2 or (v[0][0] >= 1 and v[0][1] >= 1)


def is_version_2_6() -> bool:
"""
Check if this singularity version is exactly version 2.6.
Expand Down Expand Up @@ -119,6 +127,12 @@ def is_version_3_9_or_newer() -> bool:
return v[0][0] >= 4 or (v[0][0] == 3 and v[0][1] >= 9)


def is_version_3_10_or_newer() -> bool:
"""Detect if Singularity v3.10+ is available."""
v = get_version()
return v[0][0] >= 4 or (v[0][0] == 3 and v[0][1] >= 10)


def _normalize_image_id(string: str) -> str:
return string.replace("/", "_") + ".img"

Expand Down Expand Up @@ -464,14 +478,18 @@ def create_runtime(
) -> tuple[list[str], Optional[str]]:
"""Return the Singularity runtime list of commands and options."""
any_path_okay = self.builder.get_requirement("DockerRequirement")[1] or False

runtime = [
"singularity",
"--quiet",
"exec",
"run" if is_apptainer_1_1_or_newer() or is_version_3_10_or_newer() else "exec",
"--contain",
"--ipc",
"--cleanenv",
]
if is_apptainer_1_1_or_newer() or is_version_3_10_or_newer():
runtime.append("--no-eval")

if singularity_supports_userns():
runtime.append("--userns")
else:
Expand Down
3 changes: 3 additions & 0 deletions tests/test_environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ def BIND(v: str, env: Env) -> bool:
return v.startswith(tmp_prefix) and v.endswith(":/tmp")

sing_vars["SINGULARITY_BIND"] = BIND
if vminor >= 10:
sing_vars["SINGULARITY_COMMAND"] = "run"
sing_vars["SINGULARITY_NO_EVAL"] = None

result.update(sing_vars)

Expand Down

0 comments on commit 1557c8d

Please sign in to comment.