diff --git a/oci/oci.go b/oci/oci.go index 114c0935..c53fe83c 100644 --- a/oci/oci.go +++ b/oci/oci.go @@ -412,15 +412,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)) @@ -435,24 +426,16 @@ func (r *Runtime) ExecSync(c *Container, command []string, timeout int64) (resp } args = append(args, "-l", logPath) - 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...) @@ -741,3 +724,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 857e6e27..fe2f6ba4 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