| package volume |
| |
| import ( |
| "fmt" |
| "sort" |
| "text/tabwriter" |
| |
| "golang.org/x/net/context" |
| |
| "github.com/docker/docker/api/client" |
| "github.com/docker/docker/cli" |
| "github.com/docker/engine-api/types" |
| "github.com/docker/engine-api/types/filters" |
| "github.com/spf13/cobra" |
| ) |
| |
| type byVolumeName []*types.Volume |
| |
| func (r byVolumeName) Len() int { return len(r) } |
| func (r byVolumeName) Swap(i, j int) { r[i], r[j] = r[j], r[i] } |
| func (r byVolumeName) Less(i, j int) bool { |
| return r[i].Name < r[j].Name |
| } |
| |
| type listOptions struct { |
| quiet bool |
| filter []string |
| } |
| |
| func newListCommand(dockerCli *client.DockerCli) *cobra.Command { |
| var opts listOptions |
| |
| cmd := &cobra.Command{ |
| Use: "ls [OPTIONS]", |
| Aliases: []string{"list"}, |
| Short: "List volumes", |
| Long: listDescription, |
| Args: cli.NoArgs, |
| RunE: func(cmd *cobra.Command, args []string) error { |
| return runList(dockerCli, opts) |
| }, |
| } |
| |
| flags := cmd.Flags() |
| flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display volume names") |
| flags.StringSliceVarP(&opts.filter, "filter", "f", []string{}, "Provide filter values (i.e. 'dangling=true')") |
| |
| return cmd |
| } |
| |
| func runList(dockerCli *client.DockerCli, opts listOptions) error { |
| client := dockerCli.Client() |
| |
| volFilterArgs := filters.NewArgs() |
| for _, f := range opts.filter { |
| var err error |
| volFilterArgs, err = filters.ParseFlag(f, volFilterArgs) |
| if err != nil { |
| return err |
| } |
| } |
| |
| volumes, err := client.VolumeList(context.Background(), volFilterArgs) |
| if err != nil { |
| return err |
| } |
| |
| w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) |
| if !opts.quiet { |
| for _, warn := range volumes.Warnings { |
| fmt.Fprintln(dockerCli.Err(), warn) |
| } |
| fmt.Fprintf(w, "DRIVER \tVOLUME NAME") |
| fmt.Fprintf(w, "\n") |
| } |
| |
| sort.Sort(byVolumeName(volumes.Volumes)) |
| for _, vol := range volumes.Volumes { |
| if opts.quiet { |
| fmt.Fprintln(w, vol.Name) |
| continue |
| } |
| fmt.Fprintf(w, "%s\t%s\n", vol.Driver, vol.Name) |
| } |
| w.Flush() |
| return nil |
| } |
| |
| var listDescription = ` |
| |
| Lists all the volumes Docker knows about. You can filter using the **-f** or |
| **--filter** flag. The filtering format is a **key=value** pair. To specify |
| more than one filter, pass multiple flags (for example, |
| **--filter "foo=bar" --filter "bif=baz"**) |
| |
| There is a single supported filter **dangling=value** which takes a boolean of |
| **true** or **false**. |
| |
| ` |