docker: Delete stale containerd object on start failure

containerd has two objects with regard to containers.
This is a "container" object which is metadata and a "task" which is
manging the actual runtime state.

When docker starts a container, it creates both the container metadata
and the task at the same time. So when a container exists, docker deletes
both of these objects as well.

This ensures that if, on start, when we go to create the container metadata object
in containerd, if there is an error due to a name conflict taht we go
ahead and clean that up and try again.

backport from upstream: https://github.com/moby/moby/pull/38364

Signed-off-by: Grooooot <isula@huawei.com>
This commit is contained in:
Grooooot 2020-03-17 10:42:12 +08:00
parent 62eb84806e
commit 76b6c4c1b3
4 changed files with 59 additions and 2 deletions

View File

@ -1 +1 @@
18.09.0.100 18.09.0.102

View File

@ -1,6 +1,6 @@
Name: docker-engine Name: docker-engine
Version: 18.09.0 Version: 18.09.0
Release: 101 Release: 102
Summary: The open-source application container engine Summary: The open-source application container engine
Group: Tools/Docker Group: Tools/Docker

View File

@ -0,0 +1,56 @@
From 6fe2bd73981651b275e508dd2c4806b20853684b Mon Sep 17 00:00:00 2001
From: Grooooot <isula@huawei.com>
Date: Tue, 17 Mar 2020 10:34:59 +0800
Subject: [PATCH] docker: Delete stale containerd object on start failure
containerd has two objects with regard to containers.
This is a "container" object which is metadata and a "task" which is
manging the actual runtime state.
When docker starts a container, it creates both the container metadata
and the task at the same time. So when a container exists, docker deletes
both of these objects as well.
This ensures that if, on start, when we go to create the container metadata object
in containerd, if there is an error due to a name conflict taht we go
ahead and clean that up and try again.
backport from upstream: https://github.com/moby/moby/pull/38364
Signed-off-by: Grooooot <isula@huawei.com>
---
components/engine/daemon/start.go | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/components/engine/daemon/start.go b/components/engine/daemon/start.go
index 8ff636b..07bffaa 100644
--- a/components/engine/daemon/start.go
+++ b/components/engine/daemon/start.go
@@ -185,9 +185,22 @@ func (daemon *Daemon) containerStart(container *container.Container, checkpoint
return err
}
- err = daemon.containerd.Create(context.Background(), container.ID, spec, createOptions)
+ ctx := context.TODO()
+
+ err = daemon.containerd.Create(ctx, container.ID, spec, createOptions)
if err != nil {
- return translateContainerdStartErr(container.Path, container.SetExitCode, err)
+ if errdefs.IsConflict(err) {
+ logrus.WithError(err).WithField("container", container.ID).Error("Container not cleaned up from containerd from previous run")
+ // best effort to clean up old container object
+ daemon.containerd.DeleteTask(ctx, container.ID)
+ if err := daemon.containerd.Delete(ctx, container.ID); err != nil && !errdefs.IsNotFound(err) {
+ logrus.WithError(err).WithField("container", container.ID).Error("Error cleaning up stale containerd container object")
+ }
+ err = daemon.containerd.Create(ctx, container.ID, spec, createOptions)
+ }
+ if err != nil {
+ return translateContainerdStartErr(container.Path, container.SetExitCode, err)
+ }
}
// TODO(mlaventure): we need to specify checkpoint options here
--
1.8.3.1

View File

@ -156,3 +156,4 @@ patch/0157-docker-Support-check-manifest-and-layer-s-DiffID-inf.patch
patch/0158-docker-support-private-registry.patch patch/0158-docker-support-private-registry.patch
patch/0159-docker-extend-timeout-in-cli-testcases.patch patch/0159-docker-extend-timeout-in-cli-testcases.patch
patch/0160-docker-create-a-soft-link-from-runtime-default-to-ru.patch patch/0160-docker-create-a-soft-link-from-runtime-default-to-ru.patch
patch/0161-docker-Delete-stale-containerd-object-on-start-f.patch