Merge branch '19081-singularity-no-eval'
authorTom Clegg <tom@curii.com>
Tue, 17 May 2022 18:13:34 +0000 (14:13 -0400)
committerTom Clegg <tom@curii.com>
Tue, 17 May 2022 18:13:34 +0000 (14:13 -0400)
refs #19081

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

lib/crunchrun/singularity.go
lib/crunchrun/singularity_test.go

index 879c46c8989612913b3474ebddcb88b9be5bb122..1af0d420e4ca814c0da717b9f21ed1a432a59161 100644 (file)
@@ -299,6 +299,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...)
index cdeafee88242b3330adcf2c5ae7550fdcb104f46..bad2abef33efc25ec6e04833d58b22029694e720 100644 (file)
@@ -48,5 +48,5 @@ func (s *singularityStubSuite) TestSingularityExecArgs(c *C) {
        e.imageFilename = "/fake/image.sif"
        cmd := e.execCmd("./singularity")
        c.Check(cmd.Args, DeepEquals, []string{"./singularity", "exec", "--containall", "--cleanenv", "--pwd", "/WorkingDir", "--net", "--network=none", "--nv", "--bind", "/hostpath:/mnt:ro", "/fake/image.sif"})
-       c.Check(cmd.Env, DeepEquals, []string{"SINGULARITYENV_FOO=bar"})
+       c.Check(cmd.Env, DeepEquals, []string{"SINGULARITYENV_FOO=bar", "SINGULARITY_NO_EVAL=1"})
 }