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  }