diff --git a/builder.go b/builder.go index cae8b55827..5c51d62b9e 100644 --- a/builder.go +++ b/builder.go @@ -38,6 +38,9 @@ func (builder *Builder) mergeConfig(userConf, imageConf *Config) { if userConf.MemorySwap == 0 { userConf.MemorySwap = imageConf.MemorySwap } + if userConf.CpuShares == 0 { + userConf.CpuShares = imageConf.CpuShares + } if userConf.PortSpecs == nil || len(userConf.PortSpecs) == 0 { userConf.PortSpecs = imageConf.PortSpecs } diff --git a/commands_test.go b/commands_test.go index 80f31e4f76..05ece80dac 100644 --- a/commands_test.go +++ b/commands_test.go @@ -413,6 +413,7 @@ func TestAttachDisconnect(t *testing.T) { container, err := NewBuilder(runtime).Create( &Config{ Image: GetTestImage(runtime).Id, + CpuShares: 1000, Memory: 33554432, Cmd: []string{"/bin/cat"}, OpenStdin: true, diff --git a/container.go b/container.go index c49441e5da..d4ebc60c8b 100644 --- a/container.go +++ b/container.go @@ -56,6 +56,7 @@ type Config struct { User string Memory int64 // Memory limit (in bytes) MemorySwap int64 // Total memory usage (memory + swap); set `-1' to disable swap + CpuShares int64 // CPU shares (relative weight vs. other containers) AttachStdin bool AttachStdout bool AttachStderr bool @@ -91,6 +92,8 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *flag.FlagSet *flMemory = 0 } + flCpuShares := cmd.Int64("c", 0, "CPU shares (relative weight)") + var flPorts ListOpts cmd.Var(&flPorts, "p", "Expose a container's port to the host (use 'docker port' to see the actual mapping)") @@ -137,6 +140,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *flag.FlagSet Tty: *flTty, OpenStdin: *flStdin, Memory: *flMemory, + CpuShares: *flCpuShares, AttachStdin: flAttach.Get("stdin"), AttachStdout: flAttach.Get("stdout"), AttachStderr: flAttach.Get("stderr"), diff --git a/container_test.go b/container_test.go index 9770e800ff..3ed1763a3e 100644 --- a/container_test.go +++ b/container_test.go @@ -390,6 +390,7 @@ func TestStart(t *testing.T) { &Config{ Image: GetTestImage(runtime).Id, Memory: 33554432, + CpuShares: 1000, Cmd: []string{"/bin/cat"}, OpenStdin: true, }, @@ -1063,12 +1064,17 @@ func TestLXCConfig(t *testing.T) { memMin := 33554432 memMax := 536870912 mem := memMin + rand.Intn(memMax-memMin) + // CPU shares as well + cpuMin := 100 + cpuMax := 10000 + cpu := cpuMin + rand.Intn(cpuMax-cpuMin) container, err := NewBuilder(runtime).Create(&Config{ Image: GetTestImage(runtime).Id, Cmd: []string{"/bin/true"}, - Hostname: "foobar", - Memory: int64(mem), + Hostname: "foobar", + Memory: int64(mem), + CpuShares: int64(cpu), }, ) if err != nil { diff --git a/docs/sources/commandline/command/commit.rst b/docs/sources/commandline/command/commit.rst index c73f8d1898..1d5c503414 100644 --- a/docs/sources/commandline/command/commit.rst +++ b/docs/sources/commandline/command/commit.rst @@ -16,6 +16,7 @@ Full -run example:: {"Hostname": "", "User": "", + "CpuShares": 0, "Memory": 0, "MemorySwap": 0, "PortSpecs": ["22", "80", "443"], diff --git a/docs/sources/commandline/command/run.rst b/docs/sources/commandline/command/run.rst index d5e571b41b..95fb208dd3 100644 --- a/docs/sources/commandline/command/run.rst +++ b/docs/sources/commandline/command/run.rst @@ -9,6 +9,7 @@ Run a command in a new container -a=map[]: Attach to stdin, stdout or stderr. + -c=0: CPU shares (relative weight) -d=false: Detached mode: leave the container running in the background -e=[]: Set environment variables -h="": Container host name diff --git a/lxc_template.go b/lxc_template.go index e2be3f21cd..008a717bad 100644 --- a/lxc_template.go +++ b/lxc_template.go @@ -96,6 +96,9 @@ lxc.cgroup.memory.soft_limit_in_bytes = {{.Config.Memory}} lxc.cgroup.memory.memsw.limit_in_bytes = {{$memSwap}} {{end}} {{end}} +{{if .Config.CpuShares}} +lxc.cgroup.cpu.shares = {{.Config.CpuShares}} +{{end}} ` var LxcTemplateCompiled *template.Template diff --git a/utils.go b/utils.go index 4b416cd1e6..e7f7d319d9 100644 --- a/utils.go +++ b/utils.go @@ -507,6 +507,7 @@ func CompareConfig(a, b *Config) bool { a.User != b.User || a.Memory != b.Memory || a.MemorySwap != b.MemorySwap || + a.CpuShares != b.CpuShares || a.OpenStdin != b.OpenStdin || a.Tty != b.Tty { return false