@@ -313,7 +313,7 @@ def run(self, pull_image=True, rm_container=True,
313
313
314
314
class DockerCommandLineJob (JobBase ):
315
315
316
- def add_volumes (self , pathmapper , runtime ):
316
+ def add_volumes_docker (self , pathmapper , runtime ):
317
317
# type: (PathMapper, List[Text]) -> None
318
318
319
319
host_outdir = self .outdir
@@ -362,6 +362,44 @@ def add_volumes(self, pathmapper, runtime):
362
362
docker_windows_path_adjust (createtmp ),
363
363
docker_windows_path_adjust (vol .target )))
364
364
365
+ def add_volumes_singularity (self , pathmapper , runtime , stage_output ):
366
+ # type: (PathMapper, List[Text], bool) -> None
367
+
368
+ host_outdir = self .outdir
369
+ container_outdir = self .builder .outdir
370
+ for src , vol in pathmapper .items ():
371
+ if not vol .staged :
372
+ continue
373
+ if stage_output :
374
+ containertgt = container_outdir + vol .target [len (host_outdir ):]
375
+ else :
376
+ containertgt = vol .target
377
+ if vol .type in ("File" , "Directory" ):
378
+ if not vol .resolved .startswith ("_:" ):
379
+ runtime .append (u"--bind" )
380
+ runtime .append ("%s:%s:ro" % (docker_windows_path_adjust (vol .resolved ), docker_windows_path_adjust (containertgt )))
381
+ elif vol .type == "WritableFile" :
382
+ if self .inplace_update :
383
+ runtime .append (u"--bind" )
384
+ runtime .append ("%s:%s:rw" % (docker_windows_path_adjust (vol .resolved ), docker_windows_path_adjust (containertgt )))
385
+ else :
386
+ shutil .copy (vol .resolved , vol .target )
387
+ elif vol .type == "WritableDirectory" :
388
+ if vol .resolved .startswith ("_:" ):
389
+ os .makedirs (vol .target , 0o0755 )
390
+ else :
391
+ if self .inplace_update :
392
+ runtime .append (u"--bind" )
393
+ runtime .append ("%s:%s:rw" % (docker_windows_path_adjust (vol .resolved ), docker_windows_path_adjust (containertgt )))
394
+ else :
395
+ shutil .copytree (vol .resolved , vol .target )
396
+ elif vol .type == "CreateFile" :
397
+ createtmp = os .path .join (host_outdir , os .path .basename (vol .target ))
398
+ with open (createtmp , "wb" ) as f :
399
+ f .write (vol .resolved .encode ("utf-8" ))
400
+ runtime .append (u"--bind" )
401
+ runtime .append ("%s:%s:ro" % (docker_windows_path_adjust (createtmp ), docker_windows_path_adjust (vol .target )))
402
+
365
403
def run (self , pull_image = True , rm_container = True ,
366
404
rm_tmpdir = True , move_outputs = "move" , ** kwargs ):
367
405
# type: (bool, bool, bool, Text, **Any) -> None
@@ -371,6 +409,7 @@ def run(self, pull_image=True, rm_container=True,
371
409
img_id = None
372
410
env = None # type: MutableMapping[Text, Text]
373
411
user_space_docker_cmd = kwargs .get ("user_space_docker_cmd" )
412
+ container_manager = kwargs .get ("container_manager" )
374
413
if docker_req and user_space_docker_cmd :
375
414
# For user-space docker implementations, a local image name or ID
376
415
# takes precedence over a network pull
@@ -411,61 +450,88 @@ def run(self, pull_image=True, rm_container=True,
411
450
412
451
self ._setup (kwargs )
413
452
414
- if user_space_docker_cmd :
415
- runtime = [user_space_docker_cmd , u"run" ]
416
- else :
417
- runtime = [u"docker" , u"run" , u"-i" ]
453
+ if container_manager == "docker" :
454
+ if user_space_docker_cmd :
455
+ runtime = [user_space_docker_cmd , u"run" ]
456
+ else :
457
+ runtime = [u"docker" , u"run" , u"-i" ]
418
458
419
- runtime .append (u"--volume=%s:%s:rw" % (
420
- docker_windows_path_adjust (os .path .realpath (self .outdir )),
421
- self .builder .outdir ))
422
- runtime .append (u"--volume=%s:%s:rw" % (
423
- docker_windows_path_adjust (os .path .realpath (self .tmpdir )), "/tmp" ))
459
+ runtime .append (u"--volume=%s:%s:rw" % (
460
+ docker_windows_path_adjust (os .path .realpath (self .outdir )),
461
+ self .builder .outdir ))
462
+ runtime .append (u"--volume=%s:%s:rw" % (
463
+ docker_windows_path_adjust (os .path .realpath (self .tmpdir )), "/tmp" ))
424
464
425
- self .add_volumes (self .pathmapper , runtime )
426
- if self .generatemapper :
427
- self .add_volumes (self .generatemapper , runtime )
465
+ self .add_volumes_docker (self .pathmapper , runtime )
466
+ if self .generatemapper :
467
+ self .add_volumes_docker (self .generatemapper , runtime )
428
468
429
- if user_space_docker_cmd :
430
- runtime = [x .replace (":ro" , "" ) for x in runtime ]
431
- runtime = [x .replace (":rw" , "" ) for x in runtime ]
469
+ if user_space_docker_cmd :
470
+ runtime = [x .replace (":ro" , "" ) for x in runtime ]
471
+ runtime = [x .replace (":rw" , "" ) for x in runtime ]
432
472
433
- runtime .append (u"--workdir=%s" % (
434
- docker_windows_path_adjust (self .builder .outdir )))
435
- if not user_space_docker_cmd :
473
+ runtime .append (u"--workdir=%s" % (
474
+ docker_windows_path_adjust (self .builder .outdir )))
475
+ if not user_space_docker_cmd :
436
476
437
- if not kwargs .get ("no_read_only" ):
438
- runtime .append (u"--read-only=true" )
477
+ if not kwargs .get ("no_read_only" ):
478
+ runtime .append (u"--read-only=true" )
439
479
440
- if kwargs .get ("custom_net" , None ) is not None :
441
- runtime .append (u"--net={0}" .format (kwargs .get ("custom_net" )))
442
- elif kwargs .get ("disable_net" , None ):
443
- runtime .append (u"--net=none" )
480
+ if kwargs .get ("custom_net" , None ) is not None :
481
+ runtime .append (u"--net={0}" .format (kwargs .get ("custom_net" )))
482
+ elif kwargs .get ("disable_net" , None ):
483
+ runtime .append (u"--net=none" )
444
484
445
- if self .stdout :
446
- runtime .append ("--log-driver=none" )
485
+ if self .stdout :
486
+ runtime .append ("--log-driver=none" )
487
+
488
+ euid , egid = docker_vm_id ()
489
+ if not onWindows ():
490
+ # MS Windows does not have getuid() or geteuid() functions
491
+ euid , egid = euid or os .geteuid (), egid or os .getgid ()
492
+
493
+ if kwargs .get ("no_match_user" , None ) is False \
494
+ and (euid , egid ) != (None , None ):
495
+ runtime .append (u"--user=%d:%d" % (euid , egid ))
496
+
497
+ if rm_container :
498
+ runtime .append (u"--rm" )
447
499
448
- euid , egid = docker_vm_id ()
449
- if not onWindows ():
450
- # MS Windows does not have getuid() or geteuid() functions
451
- euid , egid = euid or os .geteuid (), egid or os .getgid ()
500
+ runtime .append (u"--env=TMPDIR=/tmp" )
452
501
453
- if kwargs .get ("no_match_user" , None ) is False \
454
- and (euid , egid ) != (None , None ):
455
- runtime .append (u"--user=%d:%d" % (euid , egid ))
502
+ # spec currently says "HOME must be set to the designated output
503
+ # directory." but spec might change to designated temp directory.
504
+ # runtime.append("--env=HOME=/tmp")
505
+ runtime .append (u"--env=HOME=%s" % self .builder .outdir )
456
506
457
- if rm_container :
458
- runtime .append (u"--rm" )
507
+ for t , v in self .environment .items ():
508
+ runtime .append (u"--env=%s=%s" % (t , v ))
509
+ elif container_manager == "singularity" :
510
+ runtime = [u"singularity" , u"exec" ]
459
511
460
- runtime .append (u"--env=TMPDIR=/tmp" )
512
+ runtime .append (u"--bind" )
513
+ runtime .append (
514
+ u"%s:%s:rw" % (docker_windows_path_adjust (os .path .realpath (self .outdir )), self .builder .outdir ))
515
+ runtime .append (u"--bind" )
516
+ runtime .append (u"%s:%s:rw" % (docker_windows_path_adjust (os .path .realpath (self .tmpdir )), "/tmp" ))
517
+
518
+ self .add_volumes_singularity (self .pathmapper , runtime , False )
519
+ if self .generatemapper :
520
+ self .add_volumes_singularity (self .generatemapper , runtime , True )
521
+
522
+ runtime .append (u"--pwd" )
523
+ runtime .append ("%s" % (docker_windows_path_adjust (self .builder .outdir )))
524
+ # runtime.append(u"--read-only=true") # true by default for Singularity images
525
+
526
+ if kwargs .get ("custom_net" , None ) is not None :
527
+ raise UnsupportedRequirement (
528
+ "Singularity implementation does not support networking" )
461
529
462
- # spec currently says "HOME must be set to the designated output
463
- # directory." but spec might change to designated temp directory.
464
- # runtime.append("--env=HOME=/tmp")
465
- runtime .append (u"--env=HOME=%s" % self .builder .outdir )
530
+ env ["SINGULARITYENV_TMPDIR" ] = "/tmp"
531
+ env ["SINGULARITYENV_HOME" ] = self .builder .outdir
466
532
467
- for t , v in self .environment .items ():
468
- runtime . append ( u"-- env=%s=%s" % ( t , v ))
533
+ for t , v in self .environment .items ():
534
+ env [ "SINGULARITYENV_" + t ] = v
469
535
470
536
runtime .append (img_id )
471
537
0 commit comments