Skip to content
This repository has been archived by the owner on Oct 13, 2023. It is now read-only.

Commit

Permalink
Delete stale containerd object on start failure
Browse files Browse the repository at this point in the history
containerd has two objects with regard to containers.
There is a "container" object which is metadata and a "task" which is
manging the actual runtime state.

When docker starts a container, it creartes both the container metadata
and the task at the same time. So when a container exits, 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 that we go
ahead and clean that up and try again.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
  • Loading branch information
cpuguy83 committed Feb 14, 2019
1 parent 818d2dd commit 5ba30cd
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions daemon/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 5ba30cd

Please sign in to comment.