From 70581d8f98f16d6759b24d4569ab6715a9e547ca Mon Sep 17 00:00:00 2001 From: Starnop Date: Thu, 23 Aug 2018 19:57:49 +0800 Subject: [PATCH] bugfix: clean up the container if the creation fails Signed-off-by: Starnop --- cri/v1alpha1/cri.go | 12 +++++++++++- cri/v1alpha2/cri.go | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/cri/v1alpha1/cri.go b/cri/v1alpha1/cri.go index df4bb1280f..2e50cf6ec8 100644 --- a/cri/v1alpha1/cri.go +++ b/cri/v1alpha1/cri.go @@ -491,7 +491,7 @@ func (c *CriManager) ListPodSandbox(ctx context.Context, r *runtime.ListPodSandb } // CreateContainer creates a new container in the given PodSandbox. -func (c *CriManager) CreateContainer(ctx context.Context, r *runtime.CreateContainerRequest) (*runtime.CreateContainerResponse, error) { +func (c *CriManager) CreateContainer(ctx context.Context, r *runtime.CreateContainerRequest) (_ *runtime.CreateContainerResponse, retErr error) { config := r.GetConfig() sandboxConfig := r.GetSandboxConfig() podSandboxID := r.GetPodSandboxId() @@ -550,6 +550,16 @@ func (c *CriManager) CreateContainer(ctx context.Context, r *runtime.CreateConta containerID := createResp.ID + defer func() { + // If the container failed to be created, clean up the container. + if retErr != nil { + err := c.ContainerMgr.Remove(ctx, containerID, &apitypes.ContainerRemoveOptions{Volumes: true, Force: true}) + if err != nil { + logrus.Errorf("failed to remove the container when creating container failed: %v", err) + } + } + }() + // Get container log. if config.GetLogPath() != "" { logPath := filepath.Join(sandboxConfig.GetLogDirectory(), config.GetLogPath()) diff --git a/cri/v1alpha2/cri.go b/cri/v1alpha2/cri.go index 9bd1a90a20..661761d0bf 100644 --- a/cri/v1alpha2/cri.go +++ b/cri/v1alpha2/cri.go @@ -502,7 +502,7 @@ func (c *CriManager) ListPodSandbox(ctx context.Context, r *runtime.ListPodSandb } // CreateContainer creates a new container in the given PodSandbox. -func (c *CriManager) CreateContainer(ctx context.Context, r *runtime.CreateContainerRequest) (*runtime.CreateContainerResponse, error) { +func (c *CriManager) CreateContainer(ctx context.Context, r *runtime.CreateContainerRequest) (_ *runtime.CreateContainerResponse, retErr error) { config := r.GetConfig() sandboxConfig := r.GetSandboxConfig() podSandboxID := r.GetPodSandboxId() @@ -566,6 +566,16 @@ func (c *CriManager) CreateContainer(ctx context.Context, r *runtime.CreateConta containerID := createResp.ID + defer func() { + // If the container failed to be created, clean up the container. + if retErr != nil { + err := c.ContainerMgr.Remove(ctx, containerID, &apitypes.ContainerRemoveOptions{Volumes: true, Force: true}) + if err != nil { + logrus.Errorf("failed to remove the container when creating container failed: %v", err) + } + } + }() + // Get container log. if config.GetLogPath() != "" { logPath := filepath.Join(sandboxConfig.GetLogDirectory(), config.GetLogPath())