"os"
"os/exec"
"sort"
- "strings"
"syscall"
"time"
// Singularity always makes all nvidia devices visible to the
// container. If a resource manager such as slurm or LSF told
// us to select specific devices we need to propagate that.
- for _, s := range os.Environ() {
- if strings.HasPrefix(s, "CUDA_VISIBLE_DEVICES=") {
- env = append(env, "SINGULARITYENV_"+s)
- }
+ if cudaVisibleDevices := os.Getenv("CUDA_VISIBLE_DEVICES"); cudaVisibleDevices != "" {
+ // If a resource manager such as slurm or LSF told
+ // 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...)