|
@@ -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
|