diff --git a/pkg/api/handlers/compat/containers.go b/pkg/api/handlers/compat/containers.go index 541f1b4352..6eb9092061 100644 --- a/pkg/api/handlers/compat/containers.go +++ b/pkg/api/handlers/compat/containers.go @@ -507,6 +507,14 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*container.InspectResp } sort.Strings(hc.Binds) + // Map CgroupMode to CgroupnsMode for Docker API compatibility + switch inspect.HostConfig.CgroupMode { + case "private": + hc.CgroupnsMode = container.CgroupnsModePrivate + case "host": + hc.CgroupnsMode = container.CgroupnsModeHost + } + // k8s-file == json-file if hc.LogConfig.Type == define.KubernetesLogging { hc.LogConfig.Type = define.JSONLogging diff --git a/pkg/api/handlers/compat/containers_create.go b/pkg/api/handlers/compat/containers_create.go index 77e469ddfb..57678fe57d 100644 --- a/pkg/api/handlers/compat/containers_create.go +++ b/pkg/api/handlers/compat/containers_create.go @@ -474,6 +474,7 @@ func cliOpts(cc handlers.CreateContainerConfig, rtc *config.Config) (*entities.C User: cc.Config.User, UserNS: string(cc.HostConfig.UsernsMode), UTS: string(cc.HostConfig.UTSMode), + CgroupNS: string(cc.HostConfig.CgroupnsMode), Mount: mounts, VolumesFrom: cc.HostConfig.VolumesFrom, Workdir: cc.Config.WorkingDir, diff --git a/test/apiv2/python/rest_api/test_v2_0_0_container.py b/test/apiv2/python/rest_api/test_v2_0_0_container.py index 0c8ce881aa..3c3c00fb60 100644 --- a/test/apiv2/python/rest_api/test_v2_0_0_container.py +++ b/test/apiv2/python/rest_api/test_v2_0_0_container.py @@ -458,6 +458,32 @@ class ContainerTestCase(APITestCase): self.assertTrue("8080/tcp" in inspect_response["HostConfig"]["PortBindings"]) self.assertFalse("8081/tcp" in inspect_response["HostConfig"]["PortBindings"]) + def test_host_config_cgroupns_mode(self): + for mode in ["private", "host"]: + r = requests.post( + self.podman_url + "/v1.40/containers/create", + json={ + "Name": "cgroupns_" + mode, + "Cmd": ["top"], + "Image": "alpine:latest", + "HostConfig": { + "CgroupnsMode": mode + } + }, + ) + self.assertEqual(r.status_code, 201, r.text) + payload = r.json() + container_id = payload["Id"] + self.assertIsNotNone(container_id) + + r = requests.get(self.podman_url + f"/v1.40/containers/{container_id}/json") + self.assertEqual(r.status_code, 200, r.text) + inspect_response = r.json() + self.assertEqual(mode, inspect_response["HostConfig"]["CgroupnsMode"]) + + r = requests.delete(self.podman_url + f"/v1.40/containers/{container_id}") + self.assertEqual(r.status_code, 204, r.text) + def execute_process(cmd): return subprocess.run( cmd,