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