Merge pull request #38364 from cpuguy83/fix_stale_container_on_start

Delete stale containerd object on start failure
This commit is contained in:
Brian Goff 2019-02-14 14:48:11 -08:00 committed by GitHub
commit fcb286895b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -177,9 +177,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