Fix for #3674 Can't rm
containers when disk full
Rather than creating a new directory and moving it there before deleting that new directory, just move the directory we intend to delete. In the old way, the Mkdirall could fail, which meant that you couldn't delete containers when the disk was full. Tested. Docker-DCO-1.1-Signed-off-by: Peter Waller <p@pwaller.net> (github: pwaller)
This commit is contained in:
parent
ffdc2d2657
commit
6f3d8d3908
1 changed files with 7 additions and 10 deletions
|
@ -192,20 +192,17 @@ func (a *Driver) Remove(id string) error {
|
|||
"diff",
|
||||
}
|
||||
|
||||
// Remove the dirs atomically
|
||||
// Atomically remove each directory in turn by first moving it out of the
|
||||
// way (so that docker doesn't find it anymore) before doing removal of
|
||||
// the whole tree.
|
||||
for _, p := range tmpDirs {
|
||||
// We need to use a temp dir in the same dir as the driver so Rename
|
||||
// does not fall back to the slow copy if /tmp and the driver dir
|
||||
// are on different devices
|
||||
tmp := path.Join(a.rootPath(), "tmp", p, id)
|
||||
if err := os.MkdirAll(tmp, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
realPath := path.Join(a.rootPath(), p, id)
|
||||
if err := os.Rename(realPath, tmp); err != nil && !os.IsNotExist(err) {
|
||||
tmpPath := path.Join(a.rootPath(), p, fmt.Sprintf("%s-removing", id))
|
||||
if err := os.Rename(realPath, tmpPath); err != nil && !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
defer os.RemoveAll(tmp)
|
||||
defer os.RemoveAll(tmpPath)
|
||||
}
|
||||
|
||||
// Remove the layers file for the id
|
||||
|
|
Loading…
Add table
Reference in a new issue