diff --git a/commands_test.go b/commands_test.go index 307f90bf7f..6566bbec5d 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: 1024, Memory: 33554432, Cmd: []string{"/bin/cat"}, OpenStdin: true, diff --git a/container.go b/container.go index a4bee6a6fe..1cf62c07e3 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, stdout io.Writer, capabilities *Capabilities) (*Con *flMemory = 0 } + flCpuShares := cmd.Int64("c", 1024, "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, stdout io.Writer, capabilities *Capabilities) (*Con 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 5b63b2a0e7..35fa82e659 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, }, @@ -1059,12 +1060,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..ec46039851 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=1024: 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 2d54ef4c6a..832d89441b 100644 --- a/utils.go +++ b/utils.go @@ -486,6 +486,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