package main import ( "fmt" "os" "path/filepath" "github.com/Sirupsen/logrus" "github.com/opencontainers/runtime-spec/specs-go" "github.com/urfave/cli" ) // fatal prints the error's details if it is a libcontainer specific error type // then exits the program with an exit status of 1. func fatal(err error) { // make sure the error is written to the logger logrus.Error(err) fmt.Fprintln(os.Stderr, err) os.Exit(1) } // setupSpec performs initial setup based on the cli.Context for the container func setupSpec(context *cli.Context) (*specs.Spec, error) { bundle := context.String("bundle") if bundle != "" { if err := os.Chdir(bundle); err != nil { return nil, err } } spec, err := loadSpec(specConfig) if err != nil { return nil, err } notifySocket := os.Getenv("NOTIFY_SOCKET") if notifySocket != "" { setupSdNotify(spec, notifySocket) } if os.Geteuid() != 0 { return nil, fmt.Errorf("runc should be run as root") } return spec, nil } func revisePidFile(context *cli.Context) error { pidFile := context.String("pid-file") if pidFile == "" { return nil } // convert pid-file to an absolute path so we can write to the right // file after chdir to bundle pidFile, err := filepath.Abs(pidFile) if err != nil { return err } err = context.Set("pid-file", pidFile) if err != nil { return err } return nil }