X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7285b2204d2650179782981dea2af454e607fd7f..b1ffc878a5ea6ba083b8fbc8f20c15c7a6f1e1ec:/lib/crunchrun/singularity.go diff --git a/lib/crunchrun/singularity.go b/lib/crunchrun/singularity.go index 2d8962e96a..fd26297713 100644 --- a/lib/crunchrun/singularity.go +++ b/lib/crunchrun/singularity.go @@ -6,6 +6,7 @@ package crunchrun import ( "bytes" + "context" "errors" "fmt" "io/ioutil" @@ -16,11 +17,11 @@ import ( "regexp" "sort" "strconv" + "strings" "syscall" "time" "git.arvados.org/arvados.git/sdk/go/arvados" - "golang.org/x/net/context" ) type singularityExecutor struct { @@ -43,7 +44,13 @@ func newSingularityExecutor(logf func(string, ...interface{})) (*singularityExec }, nil } -func (e *singularityExecutor) Runtime() string { return "singularity" } +func (e *singularityExecutor) Runtime() string { + buf, err := exec.Command("singularity", "--version").CombinedOutput() + if err != nil { + return "singularity (unknown version)" + } + return strings.TrimSuffix(string(buf), "\n") +} func (e *singularityExecutor) getOrCreateProject(ownerUuid string, name string, containerClient *arvados.Client) (*arvados.Group, error) { var gp arvados.GroupList @@ -310,6 +317,14 @@ func (e *singularityExecutor) execCmd(path string) *exec.Cmd { // us to select specific devices we need to propagate that. env = append(env, "SINGULARITYENV_CUDA_VISIBLE_DEVICES="+cudaVisibleDevices) } + // Singularity's default behavior is to evaluate each + // SINGULARITYENV_* env var with a shell as a double-quoted + // string and pass the result to the contained + // process. Singularity 3.10+ has an option to pass env vars + // through literally without evaluating, which is what we + // want. See https://github.com/sylabs/singularity/pull/704 + // and https://dev.arvados.org/issues/19081 + env = append(env, "SINGULARITY_NO_EVAL=1") args = append(args, e.imageFilename) args = append(args, e.spec.Command...) @@ -338,8 +353,9 @@ func (e *singularityExecutor) Start() error { return nil } -func (e *singularityExecutor) CgroupID() string { - return "" +func (e *singularityExecutor) Pid() int { + // see https://dev.arvados.org/issues/17244#note-21 + return 0 } func (e *singularityExecutor) Stop() error {