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