From fb0dfe068cd16fa530bbb86efaa38cb46dd1a011 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Mon, 28 Mar 2016 13:27:28 -0700 Subject: [PATCH] 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/` exists but `$root//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 --- delete.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/delete.go b/delete.go index 4f46564e1..3468d1061 100644 --- a/delete.go +++ b/delete.go @@ -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)