diff --git a/pkg/api/handlers/compat/containers_create.go b/pkg/api/handlers/compat/containers_create.go index a113b94ac2..68cc711839 100644 --- a/pkg/api/handlers/compat/containers_create.go +++ b/pkg/api/handlers/compat/containers_create.go @@ -127,6 +127,10 @@ func CreateContainer(w http.ResponseWriter, r *http.Request) { ic := abi.ContainerEngine{Libpod: runtime} report, err := ic.ContainerCreate(r.Context(), sg) if err != nil { + if errors.Is(err, define.ErrCtrExists) || errors.Is(err, storage.ErrDuplicateName) { + utils.Error(w, http.StatusConflict, fmt.Errorf("container create: %w", err)) + return + } utils.Error(w, http.StatusInternalServerError, fmt.Errorf("container create: %w", err)) return } 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 3c3c00fb60..3c24298f4c 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 @@ -278,6 +278,23 @@ class ContainerTestCase(APITestCase): # is zero. I think the test needs some rewrite. # self.assertIsNotNone(prune_payload["ImagesDeleted"][1]["Deleted"]) + def test_create_duplicate_name(self): + name = f"Container_{random.getrandbits(160):x}" + payload = {"Cmd": ["top"], "Image": "alpine:latest"} + + r = requests.post( + self.podman_url + f"/v1.40/containers/create?name={name}", json=payload + ) + self.assertEqual(r.status_code, 201, r.text) + container_id = r.json()["Id"] + + r = requests.post( + self.podman_url + f"/v1.40/containers/create?name={name}", json=payload + ) + self.assertEqual(r.status_code, 409, r.text) + + requests.delete(self.podman_url + f"/v1.40/containers/{container_id}?force=true") + def test_status(self): r = requests.post( self.podman_url + "/v1.40/containers/create?name=topcontainer",