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  }