Remove container root dir from an aborted start

If runc was SIGKILL'd or something happened and the container was not
able to start and runc died as well then we could get into the state
where `$root/<containerid>` exists but `$root/<containerid>/state.json`
does not.  This will not allow libcontainer to load the container to
call the delete function as it has no data on the container other than
its id.  We should just remove it in runc so that that system matches
what runc sees for the container.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2016-03-28 13:27:28 -07:00
parent 851c050340
commit fb0dfe068c
1 changed files with 15 additions and 1 deletions

View File

@ -1,6 +1,12 @@
package main
import "github.com/codegangsta/cli"
import (
"os"
"path/filepath"
"github.com/codegangsta/cli"
"github.com/opencontainers/runc/libcontainer"
)
var deleteCommand = cli.Command{
Name: "delete",
@ -17,6 +23,14 @@ status of "ubuntu01" as "destroyed" the following will delete resources held for
Action: func(context *cli.Context) {
container, err := getContainer(context)
if err != nil {
if lerr, ok := err.(libcontainer.Error); ok && lerr.Code() == libcontainer.ContainerNotExists {
// if there was an aborted start or something of the sort then the container's directory could exist but
// libcontainer does not see it because the state.json file inside that directory was never created.
path := filepath.Join(context.GlobalString("root"), context.Args().First())
if err := os.RemoveAll(path); err == nil {
return
}
}
fatal(err)
}
destroy(container)