diff --git a/components/engine/daemon/start.go b/components/engine/daemon/start.go index c00bd9ceb2..e2265a4fae 100644 --- a/components/engine/daemon/start.go +++ b/components/engine/daemon/start.go @@ -176,9 +176,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