|
@@ -87,8 +87,6 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
|
|
|
return execdriver.ExitStatus{ExitCode: -1}, err
|
|
|
}
|
|
|
|
|
|
- var term execdriver.Terminal
|
|
|
-
|
|
|
p := &libcontainer.Process{
|
|
|
Args: append([]string{c.ProcessConfig.Entrypoint}, c.ProcessConfig.Arguments...),
|
|
|
Env: c.ProcessConfig.Env,
|
|
@@ -96,36 +94,9 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
|
|
|
User: c.ProcessConfig.User,
|
|
|
}
|
|
|
|
|
|
- if c.ProcessConfig.Tty {
|
|
|
- rootuid, err := container.HostUID()
|
|
|
- if err != nil {
|
|
|
- return execdriver.ExitStatus{ExitCode: -1}, err
|
|
|
- }
|
|
|
- cons, err := p.NewConsole(rootuid)
|
|
|
- if err != nil {
|
|
|
- return execdriver.ExitStatus{ExitCode: -1}, err
|
|
|
- }
|
|
|
- term, err = NewTtyConsole(cons, pipes, rootuid)
|
|
|
- } else {
|
|
|
- p.Stdout = pipes.Stdout
|
|
|
- p.Stderr = pipes.Stderr
|
|
|
- r, w, err := os.Pipe()
|
|
|
- if err != nil {
|
|
|
- return execdriver.ExitStatus{ExitCode: -1}, err
|
|
|
- }
|
|
|
- if pipes.Stdin != nil {
|
|
|
- go func() {
|
|
|
- io.Copy(w, pipes.Stdin)
|
|
|
- w.Close()
|
|
|
- }()
|
|
|
- p.Stdin = r
|
|
|
- }
|
|
|
- term = &execdriver.StdConsole{}
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
+ if err := setupPipes(container, &c.ProcessConfig, p, pipes); err != nil {
|
|
|
return execdriver.ExitStatus{ExitCode: -1}, err
|
|
|
}
|
|
|
- c.ProcessConfig.Terminal = term
|
|
|
|
|
|
cont, err := d.factory.Create(c.ID, container)
|
|
|
if err != nil {
|
|
@@ -398,3 +369,40 @@ func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes) error {
|
|
|
func (t *TtyConsole) Close() error {
|
|
|
return t.console.Close()
|
|
|
}
|
|
|
+
|
|
|
+func setupPipes(container *configs.Config, processConfig *execdriver.ProcessConfig, p *libcontainer.Process, pipes *execdriver.Pipes) error {
|
|
|
+ var term execdriver.Terminal
|
|
|
+ var err error
|
|
|
+
|
|
|
+ if processConfig.Tty {
|
|
|
+ rootuid, err := container.HostUID()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ cons, err := p.NewConsole(rootuid)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ term, err = NewTtyConsole(cons, pipes, rootuid)
|
|
|
+ } else {
|
|
|
+ p.Stdout = pipes.Stdout
|
|
|
+ p.Stderr = pipes.Stderr
|
|
|
+ r, w, err := os.Pipe()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if pipes.Stdin != nil {
|
|
|
+ go func() {
|
|
|
+ io.Copy(w, pipes.Stdin)
|
|
|
+ w.Close()
|
|
|
+ }()
|
|
|
+ p.Stdin = r
|
|
|
+ }
|
|
|
+ term = &execdriver.StdConsole{}
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ processConfig.Terminal = term
|
|
|
+ return nil
|
|
|
+}
|