runc/main.go

108 lines
2.6 KiB
Go
Raw Normal View History

package main
import (
"os"
"path/filepath"
"runtime"
"github.com/Sirupsen/logrus"
"github.com/codegangsta/cli"
"github.com/opencontainers/runc/libcontainer"
_ "github.com/opencontainers/runc/libcontainer/nsenter"
)
const (
version = "0.1"
usage = `open container runtime
runc integrates well with existing process supervisors to provide a production container runtime environment for
applications. It can be used with your existing process monitoring tools and the container will be spawned as direct
child of the process supervisor. nsinit can be used to manage the lifetime of a single container.
Execute a simple container in your shell by running:
cd /mycontainer
runc
`
)
func init() {
if len(os.Args) > 1 && os.Args[1] == "init" {
runtime.GOMAXPROCS(1)
runtime.LockOSThread()
factory, _ := libcontainer.New("")
if err := factory.StartInitialization(); err != nil {
fatal(err)
}
panic("--this line should never been executed, congradulations--")
}
}
func main() {
app := cli.NewApp()
app.Name = "runc"
app.Usage = usage
app.Version = version
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "id",
Value: getDefaultID(),
Usage: "specify the ID to be used for the container",
},
cli.BoolFlag{
Name: "debug",
Usage: "enable debug output for logging",
},
cli.StringFlag{
Name: "root",
Value: "/var/run/ocf",
Usage: "root directory for storage of container state (this should be located in tmpfs)",
},
cli.StringFlag{
Name: "criu",
Value: "criu",
Usage: "path to the criu binary used for checkpoint and restore",
},
}
app.Commands = []cli.Command{
checkpointCommand,
eventsCommand,
restoreCommand,
specCommand,
}
app.Before = func(context *cli.Context) error {
if context.GlobalBool("debug") {
logrus.SetLevel(logrus.DebugLevel)
}
return nil
}
// default action is to execute a container
app.Action = func(context *cli.Context) {
if os.Geteuid() != 0 {
cli.ShowAppHelp(context)
logrus.Fatal("runc should be run as root")
}
spec, err := loadSpec(context.Args().First())
if err != nil {
fatal(err)
}
status, err := execContainer(context, spec)
if err != nil {
fatal(err)
}
// exit with the container's exit status so any external supervisor is
// notified of the exit with the correct exit status.
os.Exit(status)
}
//allow for relative path for the runC binary
if absPath, err := filepath.Abs(os.Args[0]); err != nil {
logrus.Fatal("Cannot convert runc path to absolute: %v", err)
} else {
os.Args[0] = absPath
}
if err := app.Run(os.Args); err != nil {
logrus.Fatal(err)
}
}