From afeab27a362fdf66c2438cac1476d067850b0593 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Thu, 7 Dec 2017 20:33:07 +0100 Subject: [PATCH] container_exec: fix terminal true process json Signed-off-by: Antonio Murdaca --- oci/oci.go | 47 +++++++++++++++++++++++----------------- server/container_exec.go | 22 +++---------------- 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/oci/oci.go b/oci/oci.go index e9ca02ae..5fb745dd 100644 --- a/oci/oci.go +++ b/oci/oci.go @@ -423,15 +423,6 @@ func (r *Runtime) ExecSync(c *Container, command []string, timeout int64) (resp os.RemoveAll(logPath) }() - f, err := ioutil.TempFile("", "exec-sync-process") - if err != nil { - return nil, ExecSyncError{ - ExitCode: -1, - Err: err, - } - } - defer os.RemoveAll(f.Name()) - var args []string args = append(args, "-c", c.id) args = append(args, "-r", r.Path(c)) @@ -447,24 +438,16 @@ func (r *Runtime) ExecSync(c *Container, command []string, timeout int64) (resp args = append(args, "-l", logPath) args = append(args, "--socket-dir-path", ContainerAttachSocketDir) - pspec := c.Spec().Process - pspec.Args = command - processJSON, err := json.Marshal(pspec) + processFile, err := PrepareProcessExec(c, command, false) if err != nil { return nil, ExecSyncError{ ExitCode: -1, Err: err, } } + defer os.RemoveAll(processFile.Name()) - if err := ioutil.WriteFile(f.Name(), processJSON, 0644); err != nil { - return nil, ExecSyncError{ - ExitCode: -1, - Err: err, - } - } - - args = append(args, "--exec-process-spec", f.Name()) + args = append(args, "--exec-process-spec", processFile.Name()) cmd := exec.Command(r.conmonPath, args...) @@ -772,3 +755,27 @@ func (r *Runtime) UnpauseContainer(c *Container) error { _, err := utils.ExecCmd(r.Path(c), "resume", c.id) return err } + +// PrepareProcessExec returns the path of the process.json used in runc exec -p +// caller is responsible to close the returned *os.File if needed. +func PrepareProcessExec(c *Container, cmd []string, tty bool) (*os.File, error) { + f, err := ioutil.TempFile("", "exec-process-") + if err != nil { + return nil, err + } + + pspec := c.Spec().Process + pspec.Args = cmd + if tty { + pspec.Terminal = true + } + processJSON, err := json.Marshal(pspec) + if err != nil { + return nil, err + } + + if err := ioutil.WriteFile(f.Name(), processJSON, 0644); err != nil { + return nil, err + } + return f, nil +} diff --git a/server/container_exec.go b/server/container_exec.go index 4c82c623..3bb37749 100644 --- a/server/container_exec.go +++ b/server/container_exec.go @@ -1,10 +1,8 @@ package server import ( - "encoding/json" "fmt" "io" - "io/ioutil" "os" "os/exec" "time" @@ -55,28 +53,14 @@ func (ss streamService) Exec(containerID string, cmd []string, stdin io.Reader, return fmt.Errorf("container is not created or running") } - f, err := ioutil.TempFile("", "exec-process") + processFile, err := oci.PrepareProcessExec(c, cmd, tty) if err != nil { return err } - defer os.RemoveAll(f.Name()) - - pspec := c.Spec().Process - pspec.Args = cmd - processJSON, err := json.Marshal(pspec) - if err != nil { - return err - } - - if err := ioutil.WriteFile(f.Name(), processJSON, 0644); err != nil { - return err - } + defer os.RemoveAll(processFile.Name()) args := []string{"exec"} - if tty { - args = append(args, "-t") - } - args = append(args, "-p", f.Name()) + args = append(args, "--process", processFile.Name()) args = append(args, c.ID()) execCmd := exec.Command(ss.runtimeServer.Runtime().Path(c), args...) var cmdErr error