mirror of
https://github.com/opencontainers/runc.git
synced 2025-09-26 19:41:35 +08:00

if NOTIFY_SOCKET is used, do not block the main runc process waiting for events on the notify socket. Bind mount the parent directory of the notify socket, so that "start" can create the socket and it is still accessible from the container. Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/opencontainers/runc/libcontainer"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
var startCommand = cli.Command{
|
|
Name: "start",
|
|
Usage: "executes the user defined process in a created container",
|
|
ArgsUsage: `<container-id>
|
|
|
|
Where "<container-id>" is your name for the instance of the container that you
|
|
are starting. The name you provide for the container instance must be unique on
|
|
your host.`,
|
|
Description: `The start command executes the user defined process in a created container.`,
|
|
Action: func(context *cli.Context) error {
|
|
if err := checkArgs(context, 1, exactArgs); err != nil {
|
|
return err
|
|
}
|
|
container, err := getContainer(context)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
status, err := container.Status()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch status {
|
|
case libcontainer.Created:
|
|
notifySocket, err := notifySocketStart(context, os.Getenv("NOTIFY_SOCKET"), container.ID())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := container.Exec(); err != nil {
|
|
return err
|
|
}
|
|
if notifySocket != nil {
|
|
return notifySocket.waitForContainer(container)
|
|
}
|
|
return nil
|
|
case libcontainer.Stopped:
|
|
return errors.New("cannot start a container that has stopped")
|
|
case libcontainer.Running:
|
|
return errors.New("cannot start an already running container")
|
|
default:
|
|
return fmt.Errorf("cannot start a container in the %s state\n", status)
|
|
}
|
|
},
|
|
}
|