update.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. runconfigopts "github.com/docker/docker/runconfig/opts"
  9. containertypes "github.com/docker/engine-api/types/container"
  10. "github.com/docker/go-units"
  11. "github.com/spf13/cobra"
  12. )
  13. type updateOptions struct {
  14. blkioWeight uint16
  15. cpuPeriod int64
  16. cpuQuota int64
  17. cpusetCpus string
  18. cpusetMems string
  19. cpuShares int64
  20. memoryString string
  21. memoryReservation string
  22. memorySwap string
  23. kernelMemory string
  24. restartPolicy string
  25. nFlag int
  26. containers []string
  27. }
  28. // NewUpdateCommand creates a new cobra.Command for `docker update`
  29. func NewUpdateCommand(dockerCli *client.DockerCli) *cobra.Command {
  30. var opts updateOptions
  31. cmd := &cobra.Command{
  32. Use: "update [OPTIONS] CONTAINER [CONTAINER...]",
  33. Short: "Update configuration of one or more containers",
  34. Args: cli.RequiresMinArgs(1),
  35. RunE: func(cmd *cobra.Command, args []string) error {
  36. opts.containers = args
  37. opts.nFlag = cmd.Flags().NFlag()
  38. return runUpdate(dockerCli, &opts)
  39. },
  40. }
  41. flags := cmd.Flags()
  42. flags.Uint16Var(&opts.blkioWeight, "blkio-weight", 0, "Block IO (relative weight), between 10 and 1000")
  43. flags.Int64Var(&opts.cpuPeriod, "cpu-period", 0, "Limit CPU CFS (Completely Fair Scheduler) period")
  44. flags.Int64Var(&opts.cpuQuota, "cpu-quota", 0, "Limit CPU CFS (Completely Fair Scheduler) quota")
  45. flags.StringVar(&opts.cpusetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)")
  46. flags.StringVar(&opts.cpusetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)")
  47. flags.Int64VarP(&opts.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)")
  48. flags.StringVarP(&opts.memoryString, "memory", "m", "", "Memory limit")
  49. flags.StringVar(&opts.memoryReservation, "memory-reservation", "", "Memory soft limit")
  50. flags.StringVar(&opts.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap")
  51. flags.StringVar(&opts.kernelMemory, "kernel-memory", "", "Kernel memory limit")
  52. flags.StringVar(&opts.restartPolicy, "restart", "", "Restart policy to apply when a container exits")
  53. return cmd
  54. }
  55. func runUpdate(dockerCli *client.DockerCli, opts *updateOptions) error {
  56. var err error
  57. if opts.nFlag == 0 {
  58. return fmt.Errorf("You must provide one or more flags when using this command.")
  59. }
  60. var memory int64
  61. if opts.memoryString != "" {
  62. memory, err = units.RAMInBytes(opts.memoryString)
  63. if err != nil {
  64. return err
  65. }
  66. }
  67. var memoryReservation int64
  68. if opts.memoryReservation != "" {
  69. memoryReservation, err = units.RAMInBytes(opts.memoryReservation)
  70. if err != nil {
  71. return err
  72. }
  73. }
  74. var memorySwap int64
  75. if opts.memorySwap != "" {
  76. if opts.memorySwap == "-1" {
  77. memorySwap = -1
  78. } else {
  79. memorySwap, err = units.RAMInBytes(opts.memorySwap)
  80. if err != nil {
  81. return err
  82. }
  83. }
  84. }
  85. var kernelMemory int64
  86. if opts.kernelMemory != "" {
  87. kernelMemory, err = units.RAMInBytes(opts.kernelMemory)
  88. if err != nil {
  89. return err
  90. }
  91. }
  92. var restartPolicy containertypes.RestartPolicy
  93. if opts.restartPolicy != "" {
  94. restartPolicy, err = runconfigopts.ParseRestartPolicy(opts.restartPolicy)
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. resources := containertypes.Resources{
  100. BlkioWeight: opts.blkioWeight,
  101. CpusetCpus: opts.cpusetCpus,
  102. CpusetMems: opts.cpusetMems,
  103. CPUShares: opts.cpuShares,
  104. Memory: memory,
  105. MemoryReservation: memoryReservation,
  106. MemorySwap: memorySwap,
  107. KernelMemory: kernelMemory,
  108. CPUPeriod: opts.cpuPeriod,
  109. CPUQuota: opts.cpuQuota,
  110. }
  111. updateConfig := containertypes.UpdateConfig{
  112. Resources: resources,
  113. RestartPolicy: restartPolicy,
  114. }
  115. ctx := context.Background()
  116. var errs []string
  117. for _, container := range opts.containers {
  118. if err := dockerCli.Client().ContainerUpdate(ctx, container, updateConfig); err != nil {
  119. errs = append(errs, err.Error())
  120. } else {
  121. fmt.Fprintf(dockerCli.Out(), "%s\n", container)
  122. }
  123. }
  124. if len(errs) > 0 {
  125. return fmt.Errorf("%s", strings.Join(errs, "\n"))
  126. }
  127. return nil
  128. }