github.com/apptainer/singularity@v3.1.1+incompatible/internal/app/singularity/oci_exec_linux.go (about) 1 // Copyright (c) 2018-2019, Sylabs Inc. All rights reserved. 2 // This software is licensed under a 3-clause BSD license. Please consult the 3 // LICENSE.md file distributed with the sources of this project regarding your 4 // rights to use or distribute this software. 5 6 package singularity 7 8 import ( 9 "encoding/json" 10 "fmt" 11 "os" 12 "strings" 13 14 "github.com/sylabs/singularity/pkg/ociruntime" 15 16 "github.com/sylabs/singularity/internal/pkg/buildcfg" 17 "github.com/sylabs/singularity/internal/pkg/runtime/engines/oci" 18 "github.com/sylabs/singularity/internal/pkg/sylog" 19 "github.com/sylabs/singularity/internal/pkg/util/exec" 20 ) 21 22 // OciExec executes a command in a container 23 func OciExec(containerID string, cmdArgs []string) error { 24 starter := buildcfg.LIBEXECDIR + "/singularity/bin/starter" 25 26 commonConfig, err := getCommonConfig(containerID) 27 if err != nil { 28 return fmt.Errorf("%s doesn't exist", containerID) 29 } 30 31 engineConfig := commonConfig.EngineConfig.(*oci.EngineConfig) 32 33 switch engineConfig.GetState().Status { 34 case ociruntime.Running, ociruntime.Paused: 35 default: 36 args := strings.Join(cmdArgs, " ") 37 return fmt.Errorf("cannot execute command %q, container '%s' is not running", args, containerID) 38 } 39 40 engineConfig.Exec = true 41 engineConfig.OciConfig.SetProcessArgs(cmdArgs) 42 43 os.Clearenv() 44 45 configData, err := json.Marshal(commonConfig) 46 if err != nil { 47 sylog.Fatalf("%s", err) 48 } 49 50 Env := []string{sylog.GetEnvVar()} 51 52 procName := fmt.Sprintf("Singularity OCI %s", containerID) 53 return exec.Pipe(starter, []string{procName}, Env, configData) 54 }