From 31c9adba67c90b82486bc7d63a6f3a8dbf403706 Mon Sep 17 00:00:00 2001 From: Bernerd Schaefer Date: Wed, 14 May 2014 10:56:55 +0200 Subject: [PATCH] "nsinit exec ..." forwards signals to container Docker-DCO-1.1-Signed-off-by: Bernerd Schaefer (github: bernerdschaefer) --- libcontainer/nsinit/nsinit/main.go | 32 +++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/libcontainer/nsinit/nsinit/main.go b/libcontainer/nsinit/nsinit/main.go index b5325d4..b076b5c 100644 --- a/libcontainer/nsinit/nsinit/main.go +++ b/libcontainer/nsinit/nsinit/main.go @@ -5,6 +5,8 @@ import ( "io/ioutil" "log" "os" + "os/exec" + "os/signal" "path/filepath" "strconv" @@ -39,7 +41,7 @@ func main() { exitCode, err = nsinit.ExecIn(container, nspid, os.Args[2:]) } else { term := nsinit.NewTerminal(os.Stdin, os.Stdout, os.Stderr, container.Tty) - exitCode, err = nsinit.Exec(container, term, "", dataPath, os.Args[2:], nsinit.DefaultCreateCommand, nil) + exitCode, err = startContainer(container, term, dataPath, os.Args[2:]) } if err != nil { @@ -95,3 +97,31 @@ func readPid() (int, error) { } return pid, nil } + +// startContainer starts the container. Returns the exit status or -1 and an +// error. +// +// Signals sent to the current process will be forwarded to container. +func startContainer(container *libcontainer.Container, term nsinit.Terminal, dataPath string, args []string) (int, error) { + var ( + cmd *exec.Cmd + sigc = make(chan os.Signal, 10) + ) + + signal.Notify(sigc) + + createCommand := func(container *libcontainer.Container, console, rootfs, dataPath, init string, pipe *os.File, args []string) *exec.Cmd { + cmd = nsinit.DefaultCreateCommand(container, console, rootfs, dataPath, init, pipe, args) + return cmd + } + + startCallback := func() { + go func() { + for sig := range sigc { + cmd.Process.Signal(sig) + } + }() + } + + return nsinit.Exec(container, term, "", dataPath, args, createCommand, startCallback) +}