1package main 2 3import ( 4 "compress/gzip" 5 "io" 6 "os" 7 "path/filepath" 8 9 winio "github.com/Microsoft/go-winio" 10 "github.com/Microsoft/hcsshim/internal/appargs" 11 "github.com/Microsoft/hcsshim/internal/ociwclayer" 12 "github.com/urfave/cli" 13) 14 15var exportCommand = cli.Command{ 16 Name: "export", 17 Usage: "exports a layer to a tar file", 18 Flags: []cli.Flag{ 19 cli.StringSliceFlag{ 20 Name: "layer, l", 21 Usage: "paths to the read-only parent layers", 22 }, 23 cli.StringFlag{ 24 Name: "output, o", 25 Usage: "output layer tar (defaults to stdout)", 26 }, 27 cli.BoolFlag{ 28 Name: "gzip, z", 29 Usage: "compress output with gzip compression", 30 }, 31 }, 32 ArgsUsage: "<layer path>", 33 Before: appargs.Validate(appargs.NonEmptyString), 34 Action: func(context *cli.Context) (err error) { 35 path, err := filepath.Abs(context.Args().First()) 36 if err != nil { 37 return err 38 } 39 40 layers, err := normalizeLayers(context.StringSlice("layer"), true) 41 if err != nil { 42 return err 43 } 44 45 err = winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege}) 46 if err != nil { 47 return err 48 } 49 50 fp := context.String("output") 51 f := os.Stdout 52 if fp != "" { 53 f, err = os.Create(fp) 54 if err != nil { 55 return err 56 } 57 defer f.Close() 58 } 59 w := io.Writer(f) 60 if context.Bool("gzip") { 61 w = gzip.NewWriter(w) 62 } 63 64 return ociwclayer.ExportLayer(w, path, layers) 65 }, 66} 67