diff --git a/cmd/ctr/commands/snapshot/snapshot.go b/cmd/ctr/commands/snapshot/snapshot.go index 59fbcf966..9def7a819 100644 --- a/cmd/ctr/commands/snapshot/snapshot.go +++ b/cmd/ctr/commands/snapshot/snapshot.go @@ -8,9 +8,11 @@ import ( "text/tabwriter" "github.com/containerd/containerd/cmd/ctr/commands" + "github.com/containerd/containerd/log" "github.com/containerd/containerd/mount" "github.com/containerd/containerd/progress" "github.com/containerd/containerd/snapshot" + digest "github.com/opencontainers/go-digest" "github.com/pkg/errors" "github.com/urfave/cli" ) @@ -31,6 +33,7 @@ var Command = cli.Command{ commitCommand, infoCommand, setLabelCommand, + unpackCommand, }, } @@ -382,6 +385,49 @@ var setLabelCommand = cli.Command{ }, } +var unpackCommand = cli.Command{ + Name: "unpack", + Usage: "unpack applies layers from a manifest to a snapshot", + ArgsUsage: "[flags] ", + Flags: commands.SnapshotterFlags, + Action: func(context *cli.Context) error { + dgst, err := digest.Parse(context.Args().First()) + if err != nil { + return err + } + client, ctx, cancel, err := commands.NewClient(context) + if err != nil { + return err + } + defer cancel() + log.G(ctx).Debugf("unpacking layers from manifest %s", dgst.String()) + // TODO: Support unpack by name + images, err := client.ListImages(ctx) + if err != nil { + return err + } + var unpacked bool + for _, image := range images { + if image.Target().Digest == dgst { + fmt.Printf("unpacking %s (%s)...", dgst, image.Target().MediaType) + if err := image.Unpack(ctx, context.String("snapshotter")); err != nil { + fmt.Println() + return err + } + fmt.Println("done") + unpacked = true + break + } + } + if !unpacked { + return errors.New("manifest not found") + } + // TODO: Get rootfs from Image + //log.G(ctx).Infof("chain ID: %s", chainID.String()) + return nil + }, +} + type snapshotTreeNode struct { Name string Parent string diff --git a/cmd/ctr/main.go b/cmd/ctr/main.go index 76212a9cf..8cdf5eb8f 100644 --- a/cmd/ctr/main.go +++ b/cmd/ctr/main.go @@ -81,7 +81,6 @@ containerd CLI images.Command, namespacesCmd.Command, pprofCommand, - rootfsCommand, runCommand, snapshot.Command, tasksCommand, diff --git a/cmd/ctr/rootfs.go b/cmd/ctr/rootfs.go deleted file mode 100644 index ac411e047..000000000 --- a/cmd/ctr/rootfs.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - "errors" - "fmt" - - "github.com/containerd/containerd/cmd/ctr/commands" - "github.com/containerd/containerd/log" - digest "github.com/opencontainers/go-digest" - "github.com/urfave/cli" -) - -var rootfsCommand = cli.Command{ - Name: "rootfs", - Usage: "setup a rootfs", - Subcommands: []cli.Command{ - rootfsUnpackCommand, - }, -} - -var rootfsUnpackCommand = cli.Command{ - Name: "unpack", - Usage: "unpack applies layers from a manifest to a snapshot", - ArgsUsage: "[flags] ", - Flags: commands.SnapshotterFlags, - Action: func(context *cli.Context) error { - dgst, err := digest.Parse(context.Args().First()) - if err != nil { - return err - } - client, ctx, cancel, err := commands.NewClient(context) - if err != nil { - return err - } - defer cancel() - log.G(ctx).Debugf("unpacking layers from manifest %s", dgst.String()) - // TODO: Support unpack by name - images, err := client.ListImages(ctx) - if err != nil { - return err - } - var unpacked bool - for _, image := range images { - if image.Target().Digest == dgst { - fmt.Printf("unpacking %s (%s)...", dgst, image.Target().MediaType) - if err := image.Unpack(ctx, context.String("snapshotter")); err != nil { - fmt.Println() - return err - } - fmt.Println("done") - unpacked = true - break - } - } - if !unpacked { - return errors.New("manifest not found") - } - // TODO: Get rootfs from Image - //log.G(ctx).Infof("chain ID: %s", chainID.String()) - return nil - }, -}