From bb411939989dabb56eb604b9a873d1dfbf0646ef Mon Sep 17 00:00:00 2001 From: Julien Barbier Date: Thu, 26 Mar 2015 23:14:31 +0000 Subject: [PATCH] Happy birthday Docker! cgroup-parent option for docker build. Thanks to Michael, Nathan and Jessie for their support! #42 Signed-off-by: Julien Barbier --- api/client/build.go | 2 ++ api/server/server.go | 1 + builder/evaluator.go | 13 +++++++------ builder/internals.go | 13 +++++++------ builder/job.go | 2 ++ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/api/client/build.go b/api/client/build.go index 800e04ac9b..107a1995f6 100644 --- a/api/client/build.go +++ b/api/client/build.go @@ -58,6 +58,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error { flCpuQuota := cmd.Int64([]string{"-cpu-quota"}, 0, "Limit the CPU CFS (Completely Fair Scheduler) quota") 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)") + flCgroupParent := cmd.String([]string{"-cgroup-parent"}, "", "Optional parent cgroup for the container") cmd.Require(flag.Exact, 1) cmd.ParseFlags(args, true) @@ -276,6 +277,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error { v.Set("cpuquota", strconv.FormatInt(*flCpuQuota, 10)) v.Set("memory", strconv.FormatInt(memory, 10)) v.Set("memswap", strconv.FormatInt(memorySwap, 10)) + v.Set("cgroupparent", *flCgroupParent) v.Set("dockerfile", *dockerfileName) diff --git a/api/server/server.go b/api/server/server.go index cdc6c18154..08932b90e8 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1346,6 +1346,7 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R buildConfig.CpuQuota = int64Value(r, "cpuquota") buildConfig.CpuSetCpus = r.FormValue("cpusetcpus") buildConfig.CpuSetMems = r.FormValue("cpusetmems") + buildConfig.CgroupParent = r.FormValue("cgroupparent") // Job cancellation. Note: not all job types support this. if closeNotifier, ok := w.(http.CloseNotifier); ok { diff --git a/builder/evaluator.go b/builder/evaluator.go index 9a2b57a8f9..214499bc02 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -121,12 +121,13 @@ type Builder struct { noBaseImage bool // indicates that this build does not start from any base image, but is being built from an empty file system. // Set resource restrictions for build containers - cpuSetCpus string - cpuSetMems string - cpuShares int64 - cpuQuota int64 - memory int64 - memorySwap int64 + cpuSetCpus string + cpuSetMems string + cpuShares int64 + cpuQuota int64 + cgroupParent string + memory int64 + memorySwap int64 cancelled <-chan struct{} // When closed, job was cancelled. } diff --git a/builder/internals.go b/builder/internals.go index ba7d45bcb1..7c3b924e77 100644 --- a/builder/internals.go +++ b/builder/internals.go @@ -546,12 +546,13 @@ func (b *Builder) create() (*daemon.Container, error) { b.Config.Image = b.image hostConfig := &runconfig.HostConfig{ - CpuShares: b.cpuShares, - CpuQuota: b.cpuQuota, - CpusetCpus: b.cpuSetCpus, - CpusetMems: b.cpuSetMems, - Memory: b.memory, - MemorySwap: b.memorySwap, + CpuShares: b.cpuShares, + CpuQuota: b.cpuQuota, + CpusetCpus: b.cpuSetCpus, + CpusetMems: b.cpuSetMems, + CgroupParent: b.cgroupParent, + Memory: b.memory, + MemorySwap: b.memorySwap, } config := *b.Config diff --git a/builder/job.go b/builder/job.go index 0ad488aae8..a64375c96b 100644 --- a/builder/job.go +++ b/builder/job.go @@ -52,6 +52,7 @@ type Config struct { CpuQuota int64 CpuSetCpus string CpuSetMems string + CgroupParent string AuthConfig *cliconfig.AuthConfig ConfigFile *cliconfig.ConfigFile @@ -166,6 +167,7 @@ func Build(d *daemon.Daemon, buildConfig *Config) error { cpuQuota: buildConfig.CpuQuota, cpuSetCpus: buildConfig.CpuSetCpus, cpuSetMems: buildConfig.CpuSetMems, + cgroupParent: buildConfig.CgroupParent, memory: buildConfig.Memory, memorySwap: buildConfig.MemorySwap, cancelled: buildConfig.WaitCancelled(),