Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var Command = &cli.Command{ Name: "run", Usage: "Run a container", ArgsUsage: "[flags] Image|RootFS ID [COMMAND] [ARG...]", Flags: append([]cli.Flag{ &cli.BoolFlag{ Name: "rm", Usage: "Remove the container after running, cannot be used with --detach", }, &cli.BoolFlag{ Name: "null-io", Usage: "Send all IO to /dev/null", }, &cli.StringFlag{ Name: "log-uri", Usage: "Log uri", }, &cli.BoolFlag{ Name: "detach", Aliases: []string{"d"}, Usage: "Detach from the task after it has started execution, cannot be used with --rm", }, &cli.StringFlag{ Name: "fifo-dir", Usage: "Directory used for storing IO FIFOs", }, &cli.StringFlag{ Name: "cgroup", Usage: "Cgroup path (To disable use of cgroup, set to \"\" explicitly)", }, &cli.StringFlag{ Name: "platform", Usage: "Run image for specific platform", }, &cli.BoolFlag{ Name: "cni", Usage: "Enable cni networking for the container", }, }, append(platformRunFlags, append(commands.RuntimeFlags, append(append(commands.SnapshotterFlags, []cli.Flag{commands.SnapshotterLabels}...), commands.ContainerFlags...)...)...)...), Action: func(cliContext *cli.Context) error { var ( err error id string ref string rm = cliContext.Bool("rm") tty = cliContext.Bool("tty") detach = cliContext.Bool("detach") config = cliContext.IsSet("config") enableCNI = cliContext.Bool("cni") ) if config { id = cliContext.Args().First() if cliContext.NArg() > 1 { return errors.New("with spec config file, only container id should be provided") } } else { id = cliContext.Args().Get(1) ref = cliContext.Args().First() if ref == "" { return errors.New("image ref must be provided") } } if id == "" { return errors.New("container id must be provided") } if rm && detach { return errors.New("flags --detach and --rm cannot be specified together") } client, ctx, cancel, err := commands.NewClient(cliContext) if err != nil { return err } defer cancel() container, err := NewContainer(ctx, client, cliContext) if err != nil { return err } if rm && !detach { defer func() { if err := container.Delete(ctx, containerd.WithSnapshotCleanup); err != nil { log.L.WithError(err).Error("failed to cleanup container") } }() } var con console.Console if tty { con = console.Current() defer con.Reset() if err := con.SetRaw(); err != nil { return err } } var network gocni.CNI if enableCNI { if network, err = gocni.New(gocni.WithDefaultConf); err != nil { return err } } opts := tasks.GetNewTaskOpts(cliContext) ioOpts := []cio.Opt{cio.WithFIFODir(cliContext.String("fifo-dir"))} task, err := tasks.NewTask(ctx, client, container, cliContext.String("checkpoint"), con, cliContext.Bool("null-io"), cliContext.String("log-uri"), ioOpts, opts...) if err != nil { return err } var statusC <-chan containerd.ExitStatus if !detach { defer func() { if enableCNI { if err := network.Remove(ctx, commands.FullID(ctx, container), ""); err != nil { log.L.WithError(err).Error("failed to remove network") } } if _, err := task.Delete(ctx, containerd.WithProcessKill); err != nil && !errdefs.IsNotFound(err) { log.L.WithError(err).Error("failed to cleanup task") } }() if statusC, err = task.Wait(ctx); err != nil { return err } } if cliContext.IsSet("pid-file") { if err := commands.WritePidFile(cliContext.String("pid-file"), int(task.Pid())); err != nil { return err } } if enableCNI { netNsPath, err := getNetNSPath(ctx, task) if err != nil { return err } if _, err := network.Setup(ctx, commands.FullID(ctx, container), netNsPath); err != nil { return err } } if err := task.Start(ctx); err != nil { return err } if detach { return nil } if tty { if err := tasks.HandleConsoleResize(ctx, task, con); err != nil { log.L.WithError(err).Error("console resize") } } else { sigc := commands.ForwardAllSignals(ctx, task) defer commands.StopCatch(sigc) } status := <-statusC code, _, err := status.Result() if err != nil { return err } if _, err := task.Delete(ctx); err != nil { return err } if code != 0 { return cli.Exit("", int(code)) } return nil }, }
Command runs a container
Functions ¶
func NewContainer ¶
func NewContainer(ctx context.Context, client *containerd.Client, cliContext *cli.Context) (containerd.Container, error)
NewContainer creates a new container
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.