Merge pull request #31582 from dnephin/misc-flag-cleanup

Cleanup some memory flags used in the CLI
This commit is contained in:
Vincent Demeester 2017-03-10 14:16:42 +01:00 committed by GitHub
commit be3e4bbe77
4 changed files with 54 additions and 161 deletions

View File

@ -18,7 +18,6 @@ import (
"github.com/docker/docker/pkg/signal" "github.com/docker/docker/pkg/signal"
runconfigopts "github.com/docker/docker/runconfig/opts" runconfigopts "github.com/docker/docker/runconfig/opts"
"github.com/docker/go-connections/nat" "github.com/docker/go-connections/nat"
units "github.com/docker/go-units"
"github.com/spf13/pflag" "github.com/spf13/pflag"
) )
@ -72,10 +71,10 @@ type containerOptions struct {
containerIDFile string containerIDFile string
entrypoint string entrypoint string
hostname string hostname string
memoryString string memory opts.MemBytes
memoryReservation string memoryReservation opts.MemBytes
memorySwap string memorySwap opts.MemSwapBytes
kernelMemory string kernelMemory opts.MemBytes
user string user string
workingDir string workingDir string
cpuCount int64 cpuCount int64
@ -89,7 +88,7 @@ type containerOptions struct {
cpusetCpus string cpusetCpus string
cpusetMems string cpusetMems string
blkioWeight uint16 blkioWeight uint16
ioMaxBandwidth string ioMaxBandwidth opts.MemBytes
ioMaxIOps uint64 ioMaxIOps uint64
swappiness int64 swappiness int64
netMode string netMode string
@ -254,12 +253,12 @@ func addFlags(flags *pflag.FlagSet) *containerOptions {
flags.Var(&copts.deviceReadIOps, "device-read-iops", "Limit read rate (IO per second) from a device") flags.Var(&copts.deviceReadIOps, "device-read-iops", "Limit read rate (IO per second) from a device")
flags.Var(&copts.deviceWriteBps, "device-write-bps", "Limit write rate (bytes per second) to a device") flags.Var(&copts.deviceWriteBps, "device-write-bps", "Limit write rate (bytes per second) to a device")
flags.Var(&copts.deviceWriteIOps, "device-write-iops", "Limit write rate (IO per second) to a device") flags.Var(&copts.deviceWriteIOps, "device-write-iops", "Limit write rate (IO per second) to a device")
flags.StringVar(&copts.ioMaxBandwidth, "io-maxbandwidth", "", "Maximum IO bandwidth limit for the system drive (Windows only)") flags.Var(&copts.ioMaxBandwidth, "io-maxbandwidth", "Maximum IO bandwidth limit for the system drive (Windows only)")
flags.Uint64Var(&copts.ioMaxIOps, "io-maxiops", 0, "Maximum IOps limit for the system drive (Windows only)") flags.Uint64Var(&copts.ioMaxIOps, "io-maxiops", 0, "Maximum IOps limit for the system drive (Windows only)")
flags.StringVar(&copts.kernelMemory, "kernel-memory", "", "Kernel memory limit") flags.Var(&copts.kernelMemory, "kernel-memory", "Kernel memory limit")
flags.StringVarP(&copts.memoryString, "memory", "m", "", "Memory limit") flags.VarP(&copts.memory, "memory", "m", "Memory limit")
flags.StringVar(&copts.memoryReservation, "memory-reservation", "", "Memory soft limit") flags.Var(&copts.memoryReservation, "memory-reservation", "Memory soft limit")
flags.StringVar(&copts.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap") flags.Var(&copts.memorySwap, "memory-swap", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap")
flags.Int64Var(&copts.swappiness, "memory-swappiness", -1, "Tune container memory swappiness (0 to 100)") flags.Int64Var(&copts.swappiness, "memory-swappiness", -1, "Tune container memory swappiness (0 to 100)")
flags.BoolVar(&copts.oomKillDisable, "oom-kill-disable", false, "Disable OOM Killer") flags.BoolVar(&copts.oomKillDisable, "oom-kill-disable", false, "Disable OOM Killer")
flags.IntVar(&copts.oomScoreAdj, "oom-score-adj", 0, "Tune host's OOM preferences (-1000 to 1000)") flags.IntVar(&copts.oomScoreAdj, "oom-score-adj", 0, "Tune host's OOM preferences (-1000 to 1000)")
@ -308,59 +307,11 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*container.Config, *c
var err error var err error
var memory int64
if copts.memoryString != "" {
memory, err = units.RAMInBytes(copts.memoryString)
if err != nil {
return nil, nil, nil, err
}
}
var memoryReservation int64
if copts.memoryReservation != "" {
memoryReservation, err = units.RAMInBytes(copts.memoryReservation)
if err != nil {
return nil, nil, nil, err
}
}
var memorySwap int64
if copts.memorySwap != "" {
if copts.memorySwap == "-1" {
memorySwap = -1
} else {
memorySwap, err = units.RAMInBytes(copts.memorySwap)
if err != nil {
return nil, nil, nil, err
}
}
}
var kernelMemory int64
if copts.kernelMemory != "" {
kernelMemory, err = units.RAMInBytes(copts.kernelMemory)
if err != nil {
return nil, nil, nil, err
}
}
swappiness := copts.swappiness swappiness := copts.swappiness
if swappiness != -1 && (swappiness < 0 || swappiness > 100) { if swappiness != -1 && (swappiness < 0 || swappiness > 100) {
return nil, nil, nil, fmt.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness) return nil, nil, nil, fmt.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness)
} }
// TODO FIXME units.RAMInBytes should have a uint64 version
var maxIOBandwidth int64
if copts.ioMaxBandwidth != "" {
maxIOBandwidth, err = units.RAMInBytes(copts.ioMaxBandwidth)
if err != nil {
return nil, nil, nil, err
}
if maxIOBandwidth < 0 {
return nil, nil, nil, fmt.Errorf("invalid value: %s. Maximum IO Bandwidth must be positive", copts.ioMaxBandwidth)
}
}
var binds []string var binds []string
volumes := copts.volumes.GetMap() volumes := copts.volumes.GetMap()
// add any bind targets to the list of container volumes // add any bind targets to the list of container volumes
@ -530,11 +481,11 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*container.Config, *c
resources := container.Resources{ resources := container.Resources{
CgroupParent: copts.cgroupParent, CgroupParent: copts.cgroupParent,
Memory: memory, Memory: copts.memory.Value(),
MemoryReservation: memoryReservation, MemoryReservation: copts.memoryReservation.Value(),
MemorySwap: memorySwap, MemorySwap: copts.memorySwap.Value(),
MemorySwappiness: &copts.swappiness, MemorySwappiness: &copts.swappiness,
KernelMemory: kernelMemory, KernelMemory: copts.kernelMemory.Value(),
OomKillDisable: &copts.oomKillDisable, OomKillDisable: &copts.oomKillDisable,
NanoCPUs: copts.cpus.Value(), NanoCPUs: copts.cpus.Value(),
CPUCount: copts.cpuCount, CPUCount: copts.cpuCount,
@ -554,7 +505,7 @@ func parse(flags *pflag.FlagSet, copts *containerOptions) (*container.Config, *c
BlkioDeviceReadIOps: copts.deviceReadIOps.GetList(), BlkioDeviceReadIOps: copts.deviceReadIOps.GetList(),
BlkioDeviceWriteIOps: copts.deviceWriteIOps.GetList(), BlkioDeviceWriteIOps: copts.deviceWriteIOps.GetList(),
IOMaximumIOps: copts.ioMaxIOps, IOMaximumIOps: copts.ioMaxIOps,
IOMaximumBandwidth: uint64(maxIOBandwidth), IOMaximumBandwidth: uint64(copts.ioMaxBandwidth),
Ulimits: copts.ulimits.GetList(), Ulimits: copts.ulimits.GetList(),
DeviceCgroupRules: copts.deviceCgroupRules.GetAll(), DeviceCgroupRules: copts.deviceCgroupRules.GetAll(),
Devices: deviceMappings, Devices: deviceMappings,

View File

@ -13,6 +13,7 @@ import (
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
networktypes "github.com/docker/docker/api/types/network" networktypes "github.com/docker/docker/api/types/network"
"github.com/docker/docker/pkg/testutil/assert"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
"github.com/docker/go-connections/nat" "github.com/docker/go-connections/nat"
"github.com/spf13/pflag" "github.com/spf13/pflag"
@ -235,28 +236,24 @@ func TestParseWithMacAddress(t *testing.T) {
func TestParseWithMemory(t *testing.T) { func TestParseWithMemory(t *testing.T) {
invalidMemory := "--memory=invalid" invalidMemory := "--memory=invalid"
validMemory := "--memory=1G" _, _, _, err := parseRun([]string{invalidMemory, "img", "cmd"})
if _, _, _, err := parseRun([]string{invalidMemory, "img", "cmd"}); err != nil && err.Error() != "invalid size: 'invalid'" { assert.Error(t, err, invalidMemory)
t.Fatalf("Expected an error with '%v' Memory, got '%v'", invalidMemory, err)
} _, hostconfig := mustParse(t, "--memory=1G")
if _, hostconfig := mustParse(t, validMemory); hostconfig.Memory != 1073741824 { assert.Equal(t, hostconfig.Memory, int64(1073741824))
t.Fatalf("Expected the config to have '1G' as Memory, got '%v'", hostconfig.Memory)
}
} }
func TestParseWithMemorySwap(t *testing.T) { func TestParseWithMemorySwap(t *testing.T) {
invalidMemory := "--memory-swap=invalid" invalidMemory := "--memory-swap=invalid"
validMemory := "--memory-swap=1G"
anotherValidMemory := "--memory-swap=-1" _, _, _, err := parseRun([]string{invalidMemory, "img", "cmd"})
if _, _, _, err := parseRun([]string{invalidMemory, "img", "cmd"}); err == nil || err.Error() != "invalid size: 'invalid'" { assert.Error(t, err, invalidMemory)
t.Fatalf("Expected an error with '%v' MemorySwap, got '%v'", invalidMemory, err)
} _, hostconfig := mustParse(t, "--memory-swap=1G")
if _, hostconfig := mustParse(t, validMemory); hostconfig.MemorySwap != 1073741824 { assert.Equal(t, hostconfig.MemorySwap, int64(1073741824))
t.Fatalf("Expected the config to have '1073741824' as MemorySwap, got '%v'", hostconfig.MemorySwap)
} _, hostconfig = mustParse(t, "--memory-swap=-1")
if _, hostconfig := mustParse(t, anotherValidMemory); hostconfig.MemorySwap != -1 { assert.Equal(t, hostconfig.MemorySwap, int64(-1))
t.Fatalf("Expected the config to have '-1' as MemorySwap, got '%v'", hostconfig.MemorySwap)
}
} }
func TestParseHostname(t *testing.T) { func TestParseHostname(t *testing.T) {

View File

@ -8,8 +8,8 @@ import (
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/cli" "github.com/docker/docker/cli"
"github.com/docker/docker/cli/command" "github.com/docker/docker/cli/command"
"github.com/docker/docker/opts"
runconfigopts "github.com/docker/docker/runconfig/opts" runconfigopts "github.com/docker/docker/runconfig/opts"
"github.com/docker/go-units"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
@ -23,10 +23,10 @@ type updateOptions struct {
cpusetCpus string cpusetCpus string
cpusetMems string cpusetMems string
cpuShares int64 cpuShares int64
memoryString string memory opts.MemBytes
memoryReservation string memoryReservation opts.MemBytes
memorySwap string memorySwap opts.MemSwapBytes
kernelMemory string kernelMemory opts.MemBytes
restartPolicy string restartPolicy string
nFlag int nFlag int
@ -60,10 +60,10 @@ func NewUpdateCommand(dockerCli *command.DockerCli) *cobra.Command {
flags.StringVar(&opts.cpusetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)") flags.StringVar(&opts.cpusetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)")
flags.StringVar(&opts.cpusetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)") flags.StringVar(&opts.cpusetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)")
flags.Int64VarP(&opts.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)") flags.Int64VarP(&opts.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)")
flags.StringVarP(&opts.memoryString, "memory", "m", "", "Memory limit") flags.VarP(&opts.memory, "memory", "m", "Memory limit")
flags.StringVar(&opts.memoryReservation, "memory-reservation", "", "Memory soft limit") flags.Var(&opts.memoryReservation, "memory-reservation", "Memory soft limit")
flags.StringVar(&opts.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap") flags.Var(&opts.memorySwap, "memory-swap", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap")
flags.StringVar(&opts.kernelMemory, "kernel-memory", "", "Kernel memory limit") flags.Var(&opts.kernelMemory, "kernel-memory", "Kernel memory limit")
flags.StringVar(&opts.restartPolicy, "restart", "", "Restart policy to apply when a container exits") flags.StringVar(&opts.restartPolicy, "restart", "", "Restart policy to apply when a container exits")
return cmd return cmd
@ -76,42 +76,6 @@ func runUpdate(dockerCli *command.DockerCli, opts *updateOptions) error {
return errors.New("You must provide one or more flags when using this command.") return errors.New("You must provide one or more flags when using this command.")
} }
var memory int64
if opts.memoryString != "" {
memory, err = units.RAMInBytes(opts.memoryString)
if err != nil {
return err
}
}
var memoryReservation int64
if opts.memoryReservation != "" {
memoryReservation, err = units.RAMInBytes(opts.memoryReservation)
if err != nil {
return err
}
}
var memorySwap int64
if opts.memorySwap != "" {
if opts.memorySwap == "-1" {
memorySwap = -1
} else {
memorySwap, err = units.RAMInBytes(opts.memorySwap)
if err != nil {
return err
}
}
}
var kernelMemory int64
if opts.kernelMemory != "" {
kernelMemory, err = units.RAMInBytes(opts.kernelMemory)
if err != nil {
return err
}
}
var restartPolicy containertypes.RestartPolicy var restartPolicy containertypes.RestartPolicy
if opts.restartPolicy != "" { if opts.restartPolicy != "" {
restartPolicy, err = runconfigopts.ParseRestartPolicy(opts.restartPolicy) restartPolicy, err = runconfigopts.ParseRestartPolicy(opts.restartPolicy)
@ -125,10 +89,10 @@ func runUpdate(dockerCli *command.DockerCli, opts *updateOptions) error {
CpusetCpus: opts.cpusetCpus, CpusetCpus: opts.cpusetCpus,
CpusetMems: opts.cpusetMems, CpusetMems: opts.cpusetMems,
CPUShares: opts.cpuShares, CPUShares: opts.cpuShares,
Memory: memory, Memory: opts.memory.Value(),
MemoryReservation: memoryReservation, MemoryReservation: opts.memoryReservation.Value(),
MemorySwap: memorySwap, MemorySwap: opts.memorySwap.Value(),
KernelMemory: kernelMemory, KernelMemory: opts.kernelMemory.Value(),
CPUPeriod: opts.cpuPeriod, CPUPeriod: opts.cpuPeriod,
CPUQuota: opts.cpuQuota, CPUQuota: opts.cpuQuota,
CPURealtimePeriod: opts.cpuRealtimePeriod, CPURealtimePeriod: opts.cpuRealtimePeriod,

View File

@ -40,8 +40,8 @@ type buildOptions struct {
buildArgs opts.ListOpts buildArgs opts.ListOpts
extraHosts opts.ListOpts extraHosts opts.ListOpts
ulimits *opts.UlimitOpt ulimits *opts.UlimitOpt
memory string memory opts.MemBytes
memorySwap string memorySwap opts.MemSwapBytes
shmSize opts.MemBytes shmSize opts.MemBytes
cpuShares int64 cpuShares int64
cpuPeriod int64 cpuPeriod int64
@ -89,8 +89,8 @@ func NewBuildCommand(dockerCli *command.DockerCli) *cobra.Command {
flags.Var(&options.buildArgs, "build-arg", "Set build-time variables") flags.Var(&options.buildArgs, "build-arg", "Set build-time variables")
flags.Var(options.ulimits, "ulimit", "Ulimit options") flags.Var(options.ulimits, "ulimit", "Ulimit options")
flags.StringVarP(&options.dockerfileName, "file", "f", "", "Name of the Dockerfile (Default is 'PATH/Dockerfile')") flags.StringVarP(&options.dockerfileName, "file", "f", "", "Name of the Dockerfile (Default is 'PATH/Dockerfile')")
flags.StringVarP(&options.memory, "memory", "m", "", "Memory limit") flags.VarP(&options.memory, "memory", "m", "Memory limit")
flags.StringVar(&options.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap") flags.Var(&options.memorySwap, "memory-swap", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap")
flags.Var(&options.shmSize, "shm-size", "Size of /dev/shm") flags.Var(&options.shmSize, "shm-size", "Size of /dev/shm")
flags.Int64VarP(&options.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)") flags.Int64VarP(&options.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)")
flags.Int64Var(&options.cpuPeriod, "cpu-period", 0, "Limit the CPU CFS (Completely Fair Scheduler) period") flags.Int64Var(&options.cpuPeriod, "cpu-period", 0, "Limit the CPU CFS (Completely Fair Scheduler) period")
@ -138,7 +138,6 @@ func (out *lastProgressOutput) WriteProgress(prog progress.Progress) error {
} }
func runBuild(dockerCli *command.DockerCli, options buildOptions) error { func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
var ( var (
buildCtx io.ReadCloser buildCtx io.ReadCloser
err error err error
@ -255,32 +254,10 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
var body io.Reader = progress.NewProgressReader(buildCtx, progressOutput, 0, "", "Sending build context to Docker daemon") var body io.Reader = progress.NewProgressReader(buildCtx, progressOutput, 0, "", "Sending build context to Docker daemon")
var memory int64
if options.memory != "" {
parsedMemory, err := units.RAMInBytes(options.memory)
if err != nil {
return err
}
memory = parsedMemory
}
var memorySwap int64
if options.memorySwap != "" {
if options.memorySwap == "-1" {
memorySwap = -1
} else {
parsedMemorySwap, err := units.RAMInBytes(options.memorySwap)
if err != nil {
return err
}
memorySwap = parsedMemorySwap
}
}
authConfigs, _ := dockerCli.GetAllCredentials() authConfigs, _ := dockerCli.GetAllCredentials()
buildOptions := types.ImageBuildOptions{ buildOptions := types.ImageBuildOptions{
Memory: memory, Memory: options.memory.Value(),
MemorySwap: memorySwap, MemorySwap: options.memorySwap.Value(),
Tags: options.tags.GetAll(), Tags: options.tags.GetAll(),
SuppressOutput: options.quiet, SuppressOutput: options.quiet,
NoCache: options.noCache, NoCache: options.noCache,
@ -333,7 +310,11 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
// Windows: show error message about modified file permissions if the // Windows: show error message about modified file permissions if the
// daemon isn't running Windows. // daemon isn't running Windows.
if response.OSType != "windows" && runtime.GOOS == "windows" && !options.quiet { if response.OSType != "windows" && runtime.GOOS == "windows" && !options.quiet {
fmt.Fprintln(dockerCli.Out(), `SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.`) fmt.Fprintln(dockerCli.Out(), "SECURITY WARNING: You are building a Docker "+
"image from Windows against a non-Windows Docker host. All files and "+
"directories added to build context will have '-rwxr-xr-x' permissions. "+
"It is recommended to double check and reset permissions for sensitive "+
"files and directories.")
} }
// Everything worked so if -q was provided the output from the daemon // Everything worked so if -q was provided the output from the daemon