From 3e890411bcaabe01c1eef43cfcd7da31cadfb0cc Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Wed, 23 Mar 2016 19:54:32 -0700 Subject: [PATCH] Add ulimit support to libcontainerd addprocess Signed-off-by: Tonis Tiigi (cherry picked from commit 8891afd8385aeb490f8b7d9db8c3828bc7d24dc1) --- integration-cli/docker_cli_exec_test.go | 11 +++++++++++ libcontainerd/client_linux.go | 1 + libcontainerd/utils_linux.go | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/integration-cli/docker_cli_exec_test.go b/integration-cli/docker_cli_exec_test.go index 81f36711bd..a8150ad2a4 100644 --- a/integration-cli/docker_cli_exec_test.go +++ b/integration-cli/docker_cli_exec_test.go @@ -485,6 +485,17 @@ func (s *DockerSuite) TestExecOnReadonlyContainer(c *check.C) { dockerCmd(c, "exec", "parent", "true") } +func (s *DockerSuite) TestExecUlimits(c *check.C) { + testRequires(c, DaemonIsLinux) + name := "testexeculimits" + runSleepingContainer(c, "-d", "--ulimit", "nproc=21", "--name", name) + c.Assert(waitRun(name), checker.IsNil) + + out, _, err := dockerCmdWithError("exec", name, "sh", "-c", "ulimit -p") + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Equals, "21") +} + // #15750 func (s *DockerSuite) TestExecStartFails(c *check.C) { // TODO Windows CI. This test should be portable. Figure out why it fails diff --git a/libcontainerd/client_linux.go b/libcontainerd/client_linux.go index 9fd3d60175..f747b2fe2e 100644 --- a/libcontainerd/client_linux.go +++ b/libcontainerd/client_linux.go @@ -79,6 +79,7 @@ func (clnt *client) AddProcess(containerID, processFriendlyName string, specp Pr ApparmorProfile: sp.ApparmorProfile, SelinuxLabel: sp.SelinuxLabel, NoNewPrivileges: sp.NoNewPrivileges, + Rlimits: convertRlimits(sp.Rlimits), } iopipe, err := p.openFifos(sp.Terminal) diff --git a/libcontainerd/utils_linux.go b/libcontainerd/utils_linux.go index cf0f2e0d31..5b67244f0c 100644 --- a/libcontainerd/utils_linux.go +++ b/libcontainerd/utils_linux.go @@ -39,3 +39,14 @@ func systemPid(ctr *containerd.Container) uint32 { } return pid } + +func convertRlimits(sr []specs.Rlimit) (cr []*containerd.Rlimit) { + for _, r := range sr { + cr = append(cr, &containerd.Rlimit{ + Type: r.Type, + Hard: r.Hard, + Soft: r.Soft, + }) + } + return +}