package main import ( "context" "os" "github.com/moby/sys/userns" "github.com/sirupsen/logrus" "github.com/urfave/cli/v3" ) var restoreCommand = &cli.Command{ Name: "restore", Usage: "restore a container from a previous checkpoint", ArgsUsage: ` Where "" is the name for the instance of the container to be restored.`, Description: `Restores the saved state of the container instance that was previously saved using the runc checkpoint command.`, // Disable comma as separator for slice flags. DisableSliceFlagSeparator: true, Flags: []cli.Flag{ &cli.StringFlag{ Name: "console-socket", Value: "", Usage: "path to an AF_UNIX socket which will receive a file descriptor referencing the master end of the console's pseudoterminal", }, &cli.StringFlag{ Name: "image-path", Value: "", Usage: "path to criu image files for restoring", }, &cli.StringFlag{ Name: "work-path", Value: "", Usage: "path for saving work files and logs", }, &cli.BoolFlag{ Name: "tcp-established", Usage: "allow open tcp connections", }, &cli.BoolFlag{ Name: "ext-unix-sk", Usage: "allow external unix sockets", }, &cli.BoolFlag{ Name: "shell-job", Usage: "allow shell jobs", }, &cli.BoolFlag{ Name: "file-locks", Usage: "handle file locks, for safety", }, &cli.StringFlag{ Name: "manage-cgroups-mode", Value: "", Usage: "cgroups mode: soft|full|strict|ignore (default: soft)", }, &cli.StringFlag{ Name: "bundle", Aliases: []string{"b"}, Value: "", Usage: "path to the root of the bundle directory", }, &cli.BoolFlag{ Name: "detach", Aliases: []string{"d"}, Usage: "detach from the container's process", }, &cli.StringFlag{ Name: "pid-file", Value: "", Usage: "specify the file to write the process id to", }, &cli.BoolFlag{ Name: "no-subreaper", Usage: "disable the use of the subreaper used to reap reparented processes", }, &cli.BoolFlag{ Name: "no-pivot", Usage: "do not use pivot root to jail process inside rootfs. This should be used whenever the rootfs is on top of a ramdisk", }, &cli.StringSliceFlag{ Name: "empty-ns", Usage: "create a namespace, but don't restore its properties", }, &cli.BoolFlag{ Name: "auto-dedup", Usage: "enable auto deduplication of memory images", }, &cli.BoolFlag{ Name: "lazy-pages", Usage: "use userfaultfd to lazily restore memory pages", }, &cli.StringFlag{ Name: "lsm-profile", Value: "", Usage: "Specify an LSM profile to be used during restore in the form of TYPE:NAME.", }, &cli.StringFlag{ Name: "lsm-mount-context", Value: "", Usage: "Specify an LSM mount context to be used during restore.", }, }, Action: func(_ context.Context, cmd *cli.Command) error { if err := checkArgs(cmd, 1, exactArgs); err != nil { return err } // XXX: Currently this is untested with rootless containers. if os.Geteuid() != 0 || userns.RunningInUserNS() { logrus.Warn("runc checkpoint is untested with rootless containers") } options, err := criuOptions(cmd) if err != nil { return err } status, err := startContainer(cmd, CT_ACT_RESTORE, options) if err != nil { return 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) return nil }, }