diff --git a/docs/compose.md b/docs/compose.md index ede5110f9cb..334133e6a61 100644 --- a/docs/compose.md +++ b/docs/compose.md @@ -22,7 +22,6 @@ which was derived from [Docker Compose file version 3 specification](https://doc ### Unimplemented YAML fields - Fields that correspond to unimplemented `docker run` flags, e.g., `services..links` (corresponds to `docker run --link`) - Fields that correspond to unimplemented `docker build` flags, e.g., `services..build.extra_hosts` (corresponds to `docker build --add-host`) -- `services..cgroup_parent` - `services..credential_spec` - `services..deploy.update_config` - `services..deploy.rollback_config` diff --git a/pkg/composer/serviceparser/serviceparser.go b/pkg/composer/serviceparser/serviceparser.go index 58b9393dbd4..ea45aa5ae4d 100644 --- a/pkg/composer/serviceparser/serviceparser.go +++ b/pkg/composer/serviceparser/serviceparser.go @@ -61,6 +61,8 @@ func warnUnknownFields(svc types.ServiceConfig) { "BlkioConfig", "CapAdd", "CapDrop", + "Cgroup", + "CgroupParent", "CPUS", "CPUSet", "CPUShares", @@ -562,6 +564,14 @@ func newContainer(project *types.Project, parsed *Service, i int) (*Container, e c.RunArgs = append(c.RunArgs, fmt.Sprintf("--cpu-shares=%d", svc.CPUShares)) } + if svc.Cgroup != "" { + c.RunArgs = append(c.RunArgs, fmt.Sprintf("--cgroupns=%s", svc.Cgroup)) + } + + if svc.CgroupParent != "" { + c.RunArgs = append(c.RunArgs, fmt.Sprintf("--cgroup-parent=%s", svc.CgroupParent)) + } + for _, v := range svc.Devices { c.RunArgs = append(c.RunArgs, fmt.Sprintf("--device=%s:%s:%s", v.Source, v.Target, v.Permissions)) } diff --git a/pkg/composer/serviceparser/serviceparser_test.go b/pkg/composer/serviceparser/serviceparser_test.go index ec23cdf6142..67711b7f55d 100644 --- a/pkg/composer/serviceparser/serviceparser_test.go +++ b/pkg/composer/serviceparser/serviceparser_test.go @@ -378,6 +378,33 @@ services: } } +func TestParseCgroup(t *testing.T) { + const dockerComposeYAML = ` +services: + foo: + image: nginx:alpine + cgroup: host + cgroup_parent: foo.slice +` + comp := testutil.NewComposeDir(t, dockerComposeYAML) + defer comp.CleanUp() + + project, err := testutil.LoadProject(comp.YAMLFullPath(), comp.ProjectName(), nil) + assert.NilError(t, err) + + fooSvc, err := project.GetService("foo") + assert.NilError(t, err) + + foo, err := Parse(project, fooSvc) + assert.NilError(t, err) + + t.Logf("foo: %+v", foo) + for _, c := range foo.Containers { + assert.Assert(t, in(c.RunArgs, "--cgroupns=host")) + assert.Assert(t, in(c.RunArgs, "--cgroup-parent=foo.slice")) + } +} + func TestParseRelative(t *testing.T) { t.Parallel()