瀏覽代碼

Merge pull request #5791 from bernerdschaefer/nsinit-exec-forwards-signals

"nsinit exec ..." forwards signals to container
Michael Crosby 11 年之前
父節點
當前提交
432e42e715
共有 1 個文件被更改,包括 31 次插入1 次删除
  1. 31 1
      pkg/libcontainer/nsinit/nsinit/main.go

+ 31 - 1
pkg/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)
+}