summaryrefslogtreecommitdiff
path: root/cmd/podman/export.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/export.go')
-rw-r--r--cmd/podman/export.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/cmd/podman/export.go b/cmd/podman/export.go
new file mode 100644
index 000000000..9b498562e
--- /dev/null
+++ b/cmd/podman/export.go
@@ -0,0 +1,65 @@
+package main
+
+import (
+ "os"
+
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+ "github.com/urfave/cli"
+)
+
+var (
+ exportFlags = []cli.Flag{
+ cli.StringFlag{
+ Name: "output, o",
+ Usage: "Write to a file, default is STDOUT",
+ Value: "/dev/stdout",
+ },
+ }
+ exportDescription = "Exports container's filesystem contents as a tar archive" +
+ " and saves it on the local machine."
+ exportCommand = cli.Command{
+ Name: "export",
+ Usage: "Export container's filesystem contents as a tar archive",
+ Description: exportDescription,
+ Flags: exportFlags,
+ Action: exportCmd,
+ ArgsUsage: "CONTAINER",
+ }
+)
+
+// exportCmd saves a container to a tarball on disk
+func exportCmd(c *cli.Context) error {
+ if err := validateFlags(c, exportFlags); err != nil {
+ return err
+ }
+
+ runtime, err := getRuntime(c)
+ if err != nil {
+ return errors.Wrapf(err, "could not get runtime")
+ }
+ defer runtime.Shutdown(false)
+
+ args := c.Args()
+ if len(args) == 0 {
+ return errors.Errorf("container id must be specified")
+ }
+ if len(args) > 1 {
+ return errors.Errorf("too many arguments given, need 1 at most.")
+ }
+
+ output := c.String("output")
+ if output == "/dev/stdout" {
+ file := os.Stdout
+ if logrus.IsTerminal(file) {
+ return errors.Errorf("refusing to export to terminal. Use -o flag or redirect")
+ }
+ }
+
+ ctr, err := runtime.LookupContainer(args[0])
+ if err != nil {
+ return errors.Wrapf(err, "error looking up container %q", args[0])
+ }
+
+ return ctr.Export(output)
+}