mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
fb0dfe068c
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>
39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/codegangsta/cli"
|
|
"github.com/opencontainers/runc/libcontainer"
|
|
)
|
|
|
|
var deleteCommand = cli.Command{
|
|
Name: "delete",
|
|
Usage: "delete any resources held by the container often used with detached containers",
|
|
ArgsUsage: `<container-id>
|
|
|
|
Where "<container-id>" is the name for the instance of the container.
|
|
|
|
For example, if the container id is "ubuntu01" and runc list currently shows the
|
|
status of "ubuntu01" as "destroyed" the following will delete resources held for
|
|
"ubuntu01" removing "ubuntu01" from the runc list of containers:
|
|
|
|
# runc delete ubuntu01`,
|
|
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)
|
|
},
|
|
}
|