Remove container from storage on --force

Currently we can get into a state where a container exists in
storage but does not exist in libpod.  If the user forces a
removal of this container, then we should remove it from storage
even if the container is owned by another tool.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2019-02-09 05:33:14 -07:00
parent 1fd9be022f
commit 233ba5bd89
4 changed files with 36 additions and 5 deletions

View File

@ -10,7 +10,9 @@ import (
"strings"
"time"
"github.com/containers/libpod/libpod/image"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/storage"
"github.com/containers/storage/pkg/stringid"
spec "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
@ -564,3 +566,16 @@ func (r *Runtime) Export(name string, path string) error {
return ctr.Export(path)
}
// RemoveContainersFromStorage attempt to remove containers from storage that do not exist in libpod database
func (r *Runtime) RemoveContainersFromStorage(ctrs []string) {
for _, i := range ctrs {
// if the container does not exist in database, attempt to remove it from storage
if _, err := r.LookupContainer(i); err != nil && errors.Cause(err) == image.ErrNoSuchCtr {
r.storageService.UnmountContainerImage(i, true)
if err := r.storageService.DeleteContainer(i); err != nil && errors.Cause(err) != storage.ErrContainerUnknown {
logrus.Errorf("Failed to remove container %q from storage: %s", i, err)
}
}
}
}