deregister containers before removing driver and containerGraph references
This is required to address a race condition described in #5553, where a container can be partially deleted -- for example, the root filesystem but not the init filesystem -- which makes it impossible to delete the container without re-adding the missing filesystems manually. This behavior has been witnessed when rebooting boxes that are configured to remove containers on shutdown in parallel with stopping the Docker daemon. Docker-DCO-1.1-Signed-off-by: Gabriel Monroy <gabriel@opdemand.com> (github: gabrtv)
This commit is contained in:
parent
1c5a3123cc
commit
9f152aacf8
1 changed files with 4 additions and 3 deletions
|
@ -272,6 +272,10 @@ func (daemon *Daemon) Destroy(container *Container) error {
|
|||
return err
|
||||
}
|
||||
|
||||
// Deregister the container before removing its directory, to avoid race conditions
|
||||
daemon.idIndex.Delete(container.ID)
|
||||
daemon.containers.Remove(element)
|
||||
|
||||
if err := daemon.driver.Remove(container.ID); err != nil {
|
||||
return fmt.Errorf("Driver %s failed to remove root filesystem %s: %s", daemon.driver, container.ID, err)
|
||||
}
|
||||
|
@ -285,9 +289,6 @@ func (daemon *Daemon) Destroy(container *Container) error {
|
|||
utils.Debugf("Unable to remove container from link graph: %s", err)
|
||||
}
|
||||
|
||||
// Deregister the container before removing its directory, to avoid race conditions
|
||||
daemon.idIndex.Delete(container.ID)
|
||||
daemon.containers.Remove(element)
|
||||
if err := os.RemoveAll(container.root); err != nil {
|
||||
return fmt.Errorf("Unable to remove filesystem for %v: %v", container.ID, err)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue