github.com/hustcat/docker@v1.3.3-0.20160314103604-901c67a8eeab/api/client/update.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	Cli "github.com/docker/docker/cli"
     8  	flag "github.com/docker/docker/pkg/mflag"
     9  	"github.com/docker/docker/runconfig/opts"
    10  	"github.com/docker/engine-api/types/container"
    11  	"github.com/docker/go-units"
    12  )
    13  
    14  // CmdUpdate updates resources of one or more containers.
    15  //
    16  // Usage: docker update [OPTIONS] CONTAINER [CONTAINER...]
    17  func (cli *DockerCli) CmdUpdate(args ...string) error {
    18  	cmd := Cli.Subcmd("update", []string{"CONTAINER [CONTAINER...]"}, Cli.DockerCommands["update"].Description, true)
    19  	flBlkioWeight := cmd.Uint16([]string{"-blkio-weight"}, 0, "Block IO (relative weight), between 10 and 1000")
    20  	flCPUPeriod := cmd.Int64([]string{"-cpu-period"}, 0, "Limit CPU CFS (Completely Fair Scheduler) period")
    21  	flCPUQuota := cmd.Int64([]string{"-cpu-quota"}, 0, "Limit CPU CFS (Completely Fair Scheduler) quota")
    22  	flCpusetCpus := cmd.String([]string{"-cpuset-cpus"}, "", "CPUs in which to allow execution (0-3, 0,1)")
    23  	flCpusetMems := cmd.String([]string{"-cpuset-mems"}, "", "MEMs in which to allow execution (0-3, 0,1)")
    24  	flCPUShares := cmd.Int64([]string{"#c", "-cpu-shares"}, 0, "CPU shares (relative weight)")
    25  	flMemoryString := cmd.String([]string{"m", "-memory"}, "", "Memory limit")
    26  	flMemoryReservation := cmd.String([]string{"-memory-reservation"}, "", "Memory soft limit")
    27  	flMemorySwap := cmd.String([]string{"-memory-swap"}, "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap")
    28  	flKernelMemory := cmd.String([]string{"-kernel-memory"}, "", "Kernel memory limit")
    29  	flRestartPolicy := cmd.String([]string{"-restart"}, "", "Restart policy to apply when a container exits")
    30  
    31  	cmd.Require(flag.Min, 1)
    32  	cmd.ParseFlags(args, true)
    33  	if cmd.NFlag() == 0 {
    34  		return fmt.Errorf("You must provide one or more flags when using this command.")
    35  	}
    36  
    37  	var err error
    38  	var flMemory int64
    39  	if *flMemoryString != "" {
    40  		flMemory, err = units.RAMInBytes(*flMemoryString)
    41  		if err != nil {
    42  			return err
    43  		}
    44  	}
    45  
    46  	var memoryReservation int64
    47  	if *flMemoryReservation != "" {
    48  		memoryReservation, err = units.RAMInBytes(*flMemoryReservation)
    49  		if err != nil {
    50  			return err
    51  		}
    52  	}
    53  
    54  	var memorySwap int64
    55  	if *flMemorySwap != "" {
    56  		if *flMemorySwap == "-1" {
    57  			memorySwap = -1
    58  		} else {
    59  			memorySwap, err = units.RAMInBytes(*flMemorySwap)
    60  			if err != nil {
    61  				return err
    62  			}
    63  		}
    64  	}
    65  
    66  	var kernelMemory int64
    67  	if *flKernelMemory != "" {
    68  		kernelMemory, err = units.RAMInBytes(*flKernelMemory)
    69  		if err != nil {
    70  			return err
    71  		}
    72  	}
    73  
    74  	var restartPolicy container.RestartPolicy
    75  	if *flRestartPolicy != "" {
    76  		restartPolicy, err = opts.ParseRestartPolicy(*flRestartPolicy)
    77  		if err != nil {
    78  			return err
    79  		}
    80  	}
    81  
    82  	resources := container.Resources{
    83  		BlkioWeight:       *flBlkioWeight,
    84  		CpusetCpus:        *flCpusetCpus,
    85  		CpusetMems:        *flCpusetMems,
    86  		CPUShares:         *flCPUShares,
    87  		Memory:            flMemory,
    88  		MemoryReservation: memoryReservation,
    89  		MemorySwap:        memorySwap,
    90  		KernelMemory:      kernelMemory,
    91  		CPUPeriod:         *flCPUPeriod,
    92  		CPUQuota:          *flCPUQuota,
    93  	}
    94  
    95  	updateConfig := container.UpdateConfig{
    96  		Resources:     resources,
    97  		RestartPolicy: restartPolicy,
    98  	}
    99  
   100  	names := cmd.Args()
   101  	var errs []string
   102  	for _, name := range names {
   103  		if err := cli.client.ContainerUpdate(name, updateConfig); err != nil {
   104  			errs = append(errs, err.Error())
   105  		} else {
   106  			fmt.Fprintf(cli.out, "%s\n", name)
   107  		}
   108  	}
   109  
   110  	if len(errs) > 0 {
   111  		return fmt.Errorf("%s", strings.Join(errs, "\n"))
   112  	}
   113  
   114  	return nil
   115  }