From 9f222f171d29ae879737c04d4b389b347b644c7c Mon Sep 17 00:00:00 2001 From: Qiang Huang Date: Tue, 14 Apr 2015 10:00:48 +0800 Subject: [PATCH] Add cpuset-mems support for docker build Signed-off-by: Qiang Huang Upstream-commit: f8dc7e8754355c504562021da244c52055ab9204 Component: engine --- components/engine/api/client/build.go | 2 ++ components/engine/api/server/server.go | 1 + components/engine/builder/evaluator.go | 1 + components/engine/builder/internals.go | 1 + components/engine/builder/job.go | 2 ++ .../docs/sources/reference/commandline/cli.md | 1 + .../integration-cli/docker_cli_build_test.go | 15 ++++++++------- 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/components/engine/api/client/build.go b/components/engine/api/client/build.go index dc54c22ffa..b4ee93b2ce 100644 --- a/components/engine/api/client/build.go +++ b/components/engine/api/client/build.go @@ -56,6 +56,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error { flMemorySwap := cmd.String([]string{"-memory-swap"}, "", "Total memory (memory + swap), '-1' to disable swap") flCPUShares := cmd.Int64([]string{"c", "-cpu-shares"}, 0, "CPU shares (relative weight)") flCPUSetCpus := cmd.String([]string{"-cpuset-cpus"}, "", "CPUs in which to allow execution (0-3, 0,1)") + flCPUSetMems := cmd.String([]string{"-cpuset-mems"}, "", "MEMs in which to allow execution (0-3, 0,1)") cmd.Require(flag.Exact, 1) cmd.ParseFlags(args, true) @@ -278,6 +279,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error { } v.Set("cpusetcpus", *flCPUSetCpus) + v.Set("cpusetmems", *flCPUSetMems) v.Set("cpushares", strconv.FormatInt(*flCPUShares, 10)) v.Set("memory", strconv.FormatInt(memory, 10)) v.Set("memswap", strconv.FormatInt(memorySwap, 10)) diff --git a/components/engine/api/server/server.go b/components/engine/api/server/server.go index 7ebeb4b6aa..3e8d9bae0f 100644 --- a/components/engine/api/server/server.go +++ b/components/engine/api/server/server.go @@ -1213,6 +1213,7 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite job.Setenv("memswap", r.FormValue("memswap")) job.Setenv("memory", r.FormValue("memory")) job.Setenv("cpusetcpus", r.FormValue("cpusetcpus")) + job.Setenv("cpusetmems", r.FormValue("cpusetmems")) job.Setenv("cpushares", r.FormValue("cpushares")) // Job cancellation. Note: not all job types support this. diff --git a/components/engine/builder/evaluator.go b/components/engine/builder/evaluator.go index 6237f26630..c159e51bf9 100644 --- a/components/engine/builder/evaluator.go +++ b/components/engine/builder/evaluator.go @@ -124,6 +124,7 @@ type Builder struct { // Set resource restrictions for build containers cpuSetCpus string + cpuSetMems string cpuShares int64 memory int64 memorySwap int64 diff --git a/components/engine/builder/internals.go b/components/engine/builder/internals.go index 728ccde8ae..caa94ef2be 100644 --- a/components/engine/builder/internals.go +++ b/components/engine/builder/internals.go @@ -541,6 +541,7 @@ func (b *Builder) create() (*daemon.Container, error) { hostConfig := &runconfig.HostConfig{ CpuShares: b.cpuShares, CpusetCpus: b.cpuSetCpus, + CpusetMems: b.cpuSetMems, Memory: b.memory, MemorySwap: b.memorySwap, } diff --git a/components/engine/builder/job.go b/components/engine/builder/job.go index b0ce8ddc09..f9ff610396 100644 --- a/components/engine/builder/job.go +++ b/components/engine/builder/job.go @@ -63,6 +63,7 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) error { memorySwap = job.GetenvInt64("memswap") cpuShares = job.GetenvInt64("cpushares") cpuSetCpus = job.Getenv("cpusetcpus") + cpuSetMems = job.Getenv("cpusetmems") authConfig = ®istry.AuthConfig{} configFile = ®istry.ConfigFile{} tag string @@ -153,6 +154,7 @@ func (b *BuilderJob) CmdBuild(job *engine.Job) error { dockerfileName: dockerfileName, cpuShares: cpuShares, cpuSetCpus: cpuSetCpus, + cpuSetMems: cpuSetMems, memory: memory, memorySwap: memorySwap, cancelled: job.WaitCancelled(), diff --git a/components/engine/docs/sources/reference/commandline/cli.md b/components/engine/docs/sources/reference/commandline/cli.md index 60a604b8bb..607f670762 100644 --- a/components/engine/docs/sources/reference/commandline/cli.md +++ b/components/engine/docs/sources/reference/commandline/cli.md @@ -597,6 +597,7 @@ is returned by the `docker attach` command to its caller too: --memory-swap="" Total memory (memory + swap), `-1` to disable swap -c, --cpu-shares CPU Shares (relative weight) --cpuset-cpus="" CPUs in which to allow execution, e.g. `0-3`, `0,1` + --cpuset-mems="" MEMs in which to allow execution, e.g. `0-3`, `0,1` Builds Docker images from a Dockerfile and a "context". A build's context is the files located in the specified `PATH` or `URL`. The build process can diff --git a/components/engine/integration-cli/docker_cli_build_test.go b/components/engine/integration-cli/docker_cli_build_test.go index 40e038fc4b..1ef5088e24 100644 --- a/components/engine/integration-cli/docker_cli_build_test.go +++ b/components/engine/integration-cli/docker_cli_build_test.go @@ -5555,7 +5555,7 @@ func TestBuildResourceConstraintsAreUsed(t *testing.T) { t.Fatal(err) } - cmd := exec.Command(dockerBinary, "build", "--no-cache", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=0", "--cpu-shares=100", "-t", name, ".") + cmd := exec.Command(dockerBinary, "build", "--no-cache", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=0", "--cpuset-mems=0", "--cpu-shares=100", "-t", name, ".") cmd.Dir = ctx.Dir out, _, err := runCommandWithOutput(cmd) @@ -5573,6 +5573,7 @@ func TestBuildResourceConstraintsAreUsed(t *testing.T) { Memory float64 // Use float64 here since the json decoder sees it that way MemorySwap int CpusetCpus string + CpusetMems string CpuShares int } @@ -5586,9 +5587,9 @@ func TestBuildResourceConstraintsAreUsed(t *testing.T) { t.Fatal(err, cfg) } mem := int64(c1.Memory) - if mem != 67108864 || c1.MemorySwap != -1 || c1.CpusetCpus != "0" || c1.CpuShares != 100 { - t.Fatalf("resource constraints not set properly:\nMemory: %d, MemSwap: %d, CpusetCpus: %s, CpuShares: %d", - mem, c1.MemorySwap, c1.CpusetCpus, c1.CpuShares) + if mem != 67108864 || c1.MemorySwap != -1 || c1.CpusetCpus != "0" || c1.CpusetMems != "0" || c1.CpuShares != 100 { + t.Fatalf("resource constraints not set properly:\nMemory: %d, MemSwap: %d, CpusetCpus: %s, CpusetMems: %s, CpuShares: %d", + mem, c1.MemorySwap, c1.CpusetCpus, c1.CpusetMems, c1.CpuShares) } // Make sure constraints aren't saved to image @@ -5605,9 +5606,9 @@ func TestBuildResourceConstraintsAreUsed(t *testing.T) { t.Fatal(err, cfg) } mem = int64(c2.Memory) - if mem == 67108864 || c2.MemorySwap == -1 || c2.CpusetCpus == "0" || c2.CpuShares == 100 { - t.Fatalf("resource constraints leaked from build:\nMemory: %d, MemSwap: %d, CpusetCpus: %s, CpuShares: %d", - mem, c2.MemorySwap, c2.CpusetCpus, c2.CpuShares) + if mem == 67108864 || c2.MemorySwap == -1 || c2.CpusetCpus == "0" || c2.CpusetMems == "0" || c2.CpuShares == 100 { + t.Fatalf("resource constraints leaked from build:\nMemory: %d, MemSwap: %d, CpusetCpus: %s, CpusetMems: %s, CpuShares: %d", + mem, c2.MemorySwap, c2.CpusetCpus, c2.CpusetMems, c2.CpuShares) } logDone("build - resource constraints applied")