Skip to content

Commit 95b26b1

Browse files
committed
detect singularity --userns support
1 parent 88a1aee commit 95b26b1

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

cwltool/singularity.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
1+
"""Support for executing Docker containers using Singularity."""
12
from __future__ import absolute_import
2-
33
import logging
44
import os
55
import re
66
import shutil
7-
import subprocess
87
import sys
9-
from io import open
10-
11-
from typing import (Dict, List, Text, Optional, MutableMapping, Any)
12-
8+
from io import open # pylint: disable=redefined-builtin
9+
from typing import (Dict, List, Text, Optional, MutableMapping)
1310
from .errors import WorkflowException
1411
from .job import ContainerCommandLineJob
1512
from .pathmapper import PathMapper, ensure_writable
1613
from .process import (UnsupportedRequirement)
1714
from .utils import docker_windows_path_adjust
15+
if os.name == 'posix' and sys.version_info[0] < 3:
16+
import subprocess32 as subprocess # pylint: disable=import-error
17+
else:
18+
import subprocess
1819

1920
_logger = logging.getLogger("cwltool")
21+
_USERNS = None
22+
23+
def _singularity_supports_userns(): # type: ()->bool
24+
global _USERNS # pylint: disable=global-statement
25+
if _USERNS is None:
26+
_USERNS = "No valid /bin/sh" in subprocess.run(
27+
[u"singularity", u"exec", u"--userns", u"/etc", u"true"],
28+
stderr=subprocess.PIPE).stderr.decode('utf-8')
29+
return _USERNS
2030

2131

2232
class SingularityCommandLineJob(ContainerCommandLineJob):
@@ -154,7 +164,7 @@ def add_volumes(self, pathmapper, runtime, stage_output):
154164
elif vol.type == "WritableFile":
155165
if self.inplace_update:
156166
runtime.append(u"--bind")
157-
runtime.append("{}:{}:rw".format(
167+
runtime.append(u"{}:{}:rw".format(
158168
docker_windows_path_adjust(vol.resolved),
159169
docker_windows_path_adjust(containertgt)))
160170
else:
@@ -166,7 +176,7 @@ def add_volumes(self, pathmapper, runtime, stage_output):
166176
else:
167177
if self.inplace_update:
168178
runtime.append(u"--bind")
169-
runtime.append("{}:{}:rw".format(
179+
runtime.append(u"{}:{}:rw".format(
170180
docker_windows_path_adjust(vol.resolved),
171181
docker_windows_path_adjust(containertgt)))
172182
else:
@@ -176,7 +186,7 @@ def add_volumes(self, pathmapper, runtime, stage_output):
176186
with open(createtmp, "wb") as tmp:
177187
tmp.write(vol.resolved.encode("utf-8"))
178188
runtime.append(u"--bind")
179-
runtime.append("{}:{}:ro".format(
189+
runtime.append(u"{}:{}:ro".format(
180190
docker_windows_path_adjust(createtmp),
181191
docker_windows_path_adjust(vol.target)))
182192

@@ -192,7 +202,9 @@ def create_runtime(self,
192202
""" Returns the Singularity runtime list of commands and options."""
193203

194204
runtime = [u"singularity", u"--quiet", u"exec", u"--contain", u"--pid",
195-
u"--ipc"] # , u"--userns"]
205+
u"--ipc"]
206+
if _singularity_supports_userns():
207+
runtime.append(u"--userns")
196208
runtime.append(u"--bind")
197209
runtime.append(u"{}:{}:rw".format(
198210
docker_windows_path_adjust(os.path.realpath(self.outdir)),

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
'six >= 1.8.0',
5959
],
6060
extras_require={
61+
':python_version<"3" and platform_system=="Linux"': [ 'subprocess32' ],
6162
':python_version<"3"': [ 'pathlib2' ],
6263
'deps': ["galaxy-lib >= 17.09.3"]
6364
},

0 commit comments

Comments
 (0)