volume.go 4.2 KB

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