github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/api/client/volume.go (about) 1 package client 2 3 import ( 4 "fmt" 5 "text/tabwriter" 6 7 "github.com/docker/docker/api/types" 8 "github.com/docker/docker/api/types/filters" 9 Cli "github.com/docker/docker/cli" 10 "github.com/docker/docker/opts" 11 flag "github.com/docker/docker/pkg/mflag" 12 ) 13 14 // CmdVolume is the parent subcommand for all volume commands 15 // 16 // Usage: docker volume <COMMAND> <OPTS> 17 func (cli *DockerCli) CmdVolume(args ...string) error { 18 description := Cli.DockerCommands["volume"].Description + "\n\nCommands:\n" 19 commands := [][]string{ 20 {"create", "Create a volume"}, 21 {"inspect", "Return low-level information on a volume"}, 22 {"ls", "List volumes"}, 23 {"rm", "Remove a volume"}, 24 } 25 26 for _, cmd := range commands { 27 description += fmt.Sprintf(" %-25.25s%s\n", cmd[0], cmd[1]) 28 } 29 30 description += "\nRun 'docker volume COMMAND --help' for more information on a command" 31 cmd := Cli.Subcmd("volume", []string{"[COMMAND]"}, description, false) 32 33 cmd.Require(flag.Exact, 0) 34 err := cmd.ParseFlags(args, true) 35 cmd.Usage() 36 return err 37 } 38 39 // CmdVolumeLs outputs a list of Docker volumes. 40 // 41 // Usage: docker volume ls [OPTIONS] 42 func (cli *DockerCli) CmdVolumeLs(args ...string) error { 43 cmd := Cli.Subcmd("volume ls", nil, "List volumes", true) 44 45 quiet := cmd.Bool([]string{"q", "-quiet"}, false, "Only display volume names") 46 flFilter := opts.NewListOpts(nil) 47 cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e. 'dangling=true')") 48 49 cmd.Require(flag.Exact, 0) 50 cmd.ParseFlags(args, true) 51 52 volFilterArgs := filters.NewArgs() 53 for _, f := range flFilter.GetAll() { 54 var err error 55 volFilterArgs, err = filters.ParseFlag(f, volFilterArgs) 56 if err != nil { 57 return err 58 } 59 } 60 61 volumes, err := cli.client.VolumeList(volFilterArgs) 62 if err != nil { 63 return err 64 } 65 66 w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0) 67 if !*quiet { 68 fmt.Fprintf(w, "DRIVER \tVOLUME NAME") 69 fmt.Fprintf(w, "\n") 70 } 71 72 for _, vol := range volumes.Volumes { 73 if *quiet { 74 fmt.Fprintln(w, vol.Name) 75 continue 76 } 77 fmt.Fprintf(w, "%s\t%s\n", vol.Driver, vol.Name) 78 } 79 w.Flush() 80 return nil 81 } 82 83 // CmdVolumeInspect displays low-level information on one or more volumes. 84 // 85 // Usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...] 86 func (cli *DockerCli) CmdVolumeInspect(args ...string) error { 87 cmd := Cli.Subcmd("volume inspect", []string{"VOLUME [VOLUME...]"}, "Return low-level information on a volume", true) 88 tmplStr := cmd.String([]string{"f", "-format"}, "", "Format the output using the given go template") 89 90 cmd.Require(flag.Min, 1) 91 cmd.ParseFlags(args, true) 92 93 if err := cmd.Parse(args); err != nil { 94 return nil 95 } 96 97 inspectSearcher := func(name string) (interface{}, []byte, error) { 98 i, err := cli.client.VolumeInspect(name) 99 return i, nil, err 100 } 101 102 return cli.inspectElements(*tmplStr, cmd.Args(), inspectSearcher) 103 } 104 105 // CmdVolumeCreate creates a new container from a given image. 106 // 107 // Usage: docker volume create [OPTIONS] 108 func (cli *DockerCli) CmdVolumeCreate(args ...string) error { 109 cmd := Cli.Subcmd("volume create", nil, "Create a volume", true) 110 flDriver := cmd.String([]string{"d", "-driver"}, "local", "Specify volume driver name") 111 flName := cmd.String([]string{"-name"}, "", "Specify volume name") 112 113 flDriverOpts := opts.NewMapOpts(nil, nil) 114 cmd.Var(flDriverOpts, []string{"o", "-opt"}, "Set driver specific options") 115 116 cmd.Require(flag.Exact, 0) 117 cmd.ParseFlags(args, true) 118 119 volReq := types.VolumeCreateRequest{ 120 Driver: *flDriver, 121 DriverOpts: flDriverOpts.GetAll(), 122 Name: *flName, 123 } 124 125 vol, err := cli.client.VolumeCreate(volReq) 126 if err != nil { 127 return err 128 } 129 130 fmt.Fprintf(cli.out, "%s\n", vol.Name) 131 return nil 132 } 133 134 // CmdVolumeRm removes one or more containers. 135 // 136 // Usage: docker volume rm VOLUME [VOLUME...] 137 func (cli *DockerCli) CmdVolumeRm(args ...string) error { 138 cmd := Cli.Subcmd("volume rm", []string{"VOLUME [VOLUME...]"}, "Remove a volume", true) 139 cmd.Require(flag.Min, 1) 140 cmd.ParseFlags(args, true) 141 142 var status = 0 143 for _, name := range cmd.Args() { 144 if err := cli.client.VolumeRemove(name); err != nil { 145 fmt.Fprintf(cli.err, "%s\n", err) 146 status = 1 147 continue 148 } 149 fmt.Fprintf(cli.out, "%s\n", name) 150 } 151 152 if status != 0 { 153 return Cli.StatusError{StatusCode: status} 154 } 155 return nil 156 }