remove.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package stack
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/cli"
  6. "github.com/docker/docker/cli/command"
  7. "github.com/spf13/cobra"
  8. )
  9. type removeOptions struct {
  10. namespace string
  11. }
  12. func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command {
  13. var opts removeOptions
  14. cmd := &cobra.Command{
  15. Use: "rm STACK",
  16. Aliases: []string{"remove", "down"},
  17. Short: "Remove the stack",
  18. Args: cli.ExactArgs(1),
  19. RunE: func(cmd *cobra.Command, args []string) error {
  20. opts.namespace = args[0]
  21. return runRemove(dockerCli, opts)
  22. },
  23. }
  24. return cmd
  25. }
  26. func runRemove(dockerCli *command.DockerCli, opts removeOptions) error {
  27. namespace := opts.namespace
  28. client := dockerCli.Client()
  29. stderr := dockerCli.Err()
  30. ctx := context.Background()
  31. hasError := false
  32. services, err := getServices(ctx, client, namespace)
  33. if err != nil {
  34. return err
  35. }
  36. for _, service := range services {
  37. fmt.Fprintf(stderr, "Removing service %s\n", service.Spec.Name)
  38. if err := client.ServiceRemove(ctx, service.ID); err != nil {
  39. hasError = true
  40. fmt.Fprintf(stderr, "Failed to remove service %s: %s", service.ID, err)
  41. }
  42. }
  43. networks, err := getStackNetworks(ctx, client, namespace)
  44. if err != nil {
  45. return err
  46. }
  47. for _, network := range networks {
  48. fmt.Fprintf(stderr, "Removing network %s\n", network.Name)
  49. if err := client.NetworkRemove(ctx, network.ID); err != nil {
  50. hasError = true
  51. fmt.Fprintf(stderr, "Failed to remove network %s: %s", network.ID, err)
  52. }
  53. }
  54. if len(services) == 0 && len(networks) == 0 {
  55. fmt.Fprintf(dockerCli.Out(), "Nothing found in stack: %s\n", namespace)
  56. return nil
  57. }
  58. if hasError {
  59. return fmt.Errorf("Failed to remove some resources")
  60. }
  61. return nil
  62. }