diff --git a/cmd/kpod/common.go b/cmd/kpod/common.go index 6d1f5299..d9aab97a 100644 --- a/cmd/kpod/common.go +++ b/cmd/kpod/common.go @@ -10,6 +10,10 @@ import ( "github.com/urfave/cli" ) +var ( + stores = make(map[storage.Store]struct{}) +) + func getStore(c *libkpod.Config) (storage.Store, error) { options := storage.DefaultStoreOptions options.GraphRoot = c.Root @@ -22,9 +26,18 @@ func getStore(c *libkpod.Config) (storage.Store, error) { return nil, err } is.Transport.SetStore(store) + stores[store] = struct{}{} return store, nil } +func shutdownStores() { + for store := range stores { + if _, err := store.Shutdown(false); err != nil { + break + } + } +} + func getConfig(c *cli.Context) (*libkpod.Config, error) { config := libkpod.DefaultConfig() if c.GlobalIsSet("config") { diff --git a/cmd/kpod/diff.go b/cmd/kpod/diff.go index f8592e71..fa8c1d56 100644 --- a/cmd/kpod/diff.go +++ b/cmd/kpod/diff.go @@ -86,6 +86,7 @@ func diffCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get container server") } + defer server.Shutdown() to := c.Args().Get(0) changes, err := server.GetDiff("", to) diff --git a/cmd/kpod/inspect.go b/cmd/kpod/inspect.go index fe8d53b7..5371a495 100644 --- a/cmd/kpod/inspect.go +++ b/cmd/kpod/inspect.go @@ -71,6 +71,7 @@ func inspectCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get container server") } + defer server.Shutdown() if err = server.Update(); err != nil { return errors.Wrapf(err, "could not update list of containers") } diff --git a/cmd/kpod/logs.go b/cmd/kpod/logs.go index 013f7642..995f91cd 100644 --- a/cmd/kpod/logs.go +++ b/cmd/kpod/logs.go @@ -69,6 +69,7 @@ func logsCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not create container server") } + defer server.Shutdown() err = server.Update() if err != nil { return errors.Wrapf(err, "could not update list of containers") diff --git a/cmd/kpod/main.go b/cmd/kpod/main.go index 7ee6d854..2aa29845 100644 --- a/cmd/kpod/main.go +++ b/cmd/kpod/main.go @@ -50,6 +50,16 @@ func main() { } return nil } + app.After = func(*cli.Context) error { + // called by Run() when the command handler succeeds + shutdownStores() + return nil + } + cli.OsExiter = func(code int) { + // called by Run() when the command fails, bypassing After() + shutdownStores() + os.Exit(code) + } app.Flags = []cli.Flag{ cli.StringFlag{ Name: "config, c", @@ -82,6 +92,6 @@ func main() { } if err := app.Run(os.Args); err != nil { logrus.Errorf(err.Error()) - os.Exit(1) + cli.OsExiter(1) } } diff --git a/cmd/kpod/rename.go b/cmd/kpod/rename.go index 8ef63419..fe1f08d9 100644 --- a/cmd/kpod/rename.go +++ b/cmd/kpod/rename.go @@ -32,6 +32,7 @@ func renameCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get container server") } + defer server.Shutdown() err = server.Update() if err != nil { return errors.Wrapf(err, "could not update list of containers") diff --git a/cmd/kpod/stats.go b/cmd/kpod/stats.go index 10269f71..416acc93 100644 --- a/cmd/kpod/stats.go +++ b/cmd/kpod/stats.go @@ -70,6 +70,7 @@ func statsCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not create container server") } + defer containerServer.Shutdown() err = containerServer.Update() if err != nil { return errors.Wrapf(err, "could not update list of containers") diff --git a/libkpod/container_server.go b/libkpod/container_server.go index a495753e..3cf5e90b 100644 --- a/libkpod/container_server.go +++ b/libkpod/container_server.go @@ -570,7 +570,10 @@ func (c *ContainerServer) ReleasePodName(name string) { // Shutdown attempts to shut down the server's storage cleanly func (c *ContainerServer) Shutdown() error { _, err := c.store.Shutdown(false) - return err + if err != nil && errors.Cause(err) != cstorage.ErrLayerUsedByContainer { + return err + } + return nil } type containerServerState struct {