kill.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package container
  2. import (
  3. "fmt"
  4. "strings"
  5. "golang.org/x/net/context"
  6. "github.com/docker/docker/api/client"
  7. "github.com/docker/docker/cli"
  8. "github.com/spf13/cobra"
  9. )
  10. type killOptions struct {
  11. signal string
  12. containers []string
  13. }
  14. // NewKillCommand creates a new cobra.Command for `docker kill`
  15. func NewKillCommand(dockerCli *client.DockerCli) *cobra.Command {
  16. var opts killOptions
  17. cmd := &cobra.Command{
  18. Use: "kill [OPTIONS] CONTAINER [CONTAINER...]",
  19. Short: "Kill one or more running containers",
  20. Args: cli.RequiresMinArgs(1),
  21. RunE: func(cmd *cobra.Command, args []string) error {
  22. opts.containers = args
  23. return runKill(dockerCli, &opts)
  24. },
  25. }
  26. flags := cmd.Flags()
  27. flags.StringVarP(&opts.signal, "signal", "s", "KILL", "Signal to send to the container")
  28. return cmd
  29. }
  30. func runKill(dockerCli *client.DockerCli, opts *killOptions) error {
  31. var errs []string
  32. ctx := context.Background()
  33. for _, name := range opts.containers {
  34. if err := dockerCli.Client().ContainerKill(ctx, name, opts.signal); err != nil {
  35. errs = append(errs, err.Error())
  36. } else {
  37. fmt.Fprintf(dockerCli.Out(), "%s\n", name)
  38. }
  39. }
  40. if len(errs) > 0 {
  41. return fmt.Errorf("%s", strings.Join(errs, "\n"))
  42. }
  43. return nil
  44. }