// runProcess will create a new process in the specified container // by executing the process specified in the 'config'. func runProcess(container libcontainer.Container, config *specs.Process, listenFDs []*os.File, console string, pidFile string, detach bool) (int, error) { process := newProcess(*config) // Add extra file descriptors if needed if len(listenFDs) > 0 { process.Env = append(process.Env, fmt.Sprintf("LISTEN_FDS=%d", len(listenFDs)), "LISTEN_PID=1") process.ExtraFiles = append(process.ExtraFiles, listenFDs...) } rootuid, err := container.Config().HostUID() if err != nil { return -1, err } tty, err := setupIO(process, rootuid, console, config.Terminal, detach) if err != nil { return -1, err } handler := newSignalHandler(tty) defer handler.Close() if err := container.Start(process); err != nil { if tty != nil { tty.Close() } return -1, err } if pidFile != "" { if err := createPidFile(pidFile, process); err != nil { process.Signal(syscall.SIGKILL) process.Wait() if tty != nil { tty.Close() } return -1, err } } if detach { return 0, nil } return handler.forward(process) }