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