mirror of
https://github.com/opencontainers/runc.git
synced 2025-10-04 15:12:56 +08:00

This enables the support for the rootless container mode. There are many restrictions on what rootless containers can do, so many different runC commands have been disabled: * runc checkpoint * runc events * runc pause * runc ps * runc restore * runc resume * runc update The following commands work: * runc create * runc delete * runc exec * runc kill * runc list * runc run * runc spec * runc state In addition, any specification options that imply joining cgroups have also been disabled. This is due to support for unprivileged subtree management not being available from Linux upstream. Signed-off-by: Aleksa Sarai <asarai@suse.de>
83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/opencontainers/runtime-spec/specs-go"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
const (
|
|
exactArgs = iota
|
|
minArgs
|
|
maxArgs
|
|
)
|
|
|
|
func checkArgs(context *cli.Context, expected, checkType int) error {
|
|
var err error
|
|
cmdName := context.Command.Name
|
|
switch checkType {
|
|
case exactArgs:
|
|
if context.NArg() != expected {
|
|
err = fmt.Errorf("%s: %q requires exactly %d argument(s)", os.Args[0], cmdName, expected)
|
|
}
|
|
case minArgs:
|
|
if context.NArg() < expected {
|
|
err = fmt.Errorf("%s: %q requires a minimum of %d argument(s)", os.Args[0], cmdName, expected)
|
|
}
|
|
case maxArgs:
|
|
if context.NArg() > expected {
|
|
err = fmt.Errorf("%s: %q requires a maximum of %d argument(s)", os.Args[0], cmdName, expected)
|
|
}
|
|
}
|
|
|
|
if err != nil {
|
|
fmt.Printf("Incorrect Usage.\n\n")
|
|
cli.ShowCommandHelp(context, cmdName)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// 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
|
|
}
|
|
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
|
|
}
|
|
return context.Set("pid-file", pidFile)
|
|
}
|