diff --git a/cmd/ctr/commands/tasks/exec.go b/cmd/ctr/commands/tasks/exec.go index 3f31e2796..c1a4b8bbd 100644 --- a/cmd/ctr/commands/tasks/exec.go +++ b/cmd/ctr/commands/tasks/exec.go @@ -114,29 +114,35 @@ var execCommand = cli.Command{ stdinC = &stdinCloser{ stdin: os.Stdin, } + con console.Console ) - if logURI := context.String("log-uri"); logURI != "" { + fifoDir := context.String("fifo-dir") + logURI := context.String("log-uri") + ioOpts := []cio.Opt{cio.WithFIFODir(fifoDir)} + switch { + case tty && logURI != "": + return errors.New("can't use log-uri with tty") + case logURI != "" && fifoDir != "": + return errors.New("can't use log-uri with fifo-dir") + + case tty: + con = console.Current() + defer con.Reset() + if err := con.SetRaw(); err != nil { + return err + } + ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStreams(con, con, nil), cio.WithTerminal}, ioOpts...)...) + + case logURI != "": uri, err := url.Parse(logURI) if err != nil { return err } - - if dir := context.String("fifo-dir"); dir != "" { - return errors.New("can't use log-uri with fifo-dir") - } - - if tty { - return errors.New("can't use log-uri with tty") - } - ioCreator = cio.LogURI(uri) - } else { - cioOpts := []cio.Opt{cio.WithStreams(stdinC, os.Stdout, os.Stderr), cio.WithFIFODir(context.String("fifo-dir"))} - if tty { - cioOpts = append(cioOpts, cio.WithTerminal) - } - ioCreator = cio.NewCreator(cioOpts...) + + default: + ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStreams(stdinC, os.Stdout, os.Stderr)}, ioOpts...)...) } process, err := task.Exec(ctx, context.String("exec-id"), pspec, ioCreator) @@ -156,31 +162,20 @@ var execCommand = cli.Command{ return err } - var con console.Console - if tty { - con = console.Current() - defer con.Reset() - if err := con.SetRaw(); err != nil { - return err - } - } - if !detach { - if tty { - if err := HandleConsoleResize(ctx, process, con); err != nil { - logrus.WithError(err).Error("console resize") - } - } else { - sigc := commands.ForwardAllSignals(ctx, process) - defer commands.StopCatch(sigc) - } - } - if err := process.Start(ctx); err != nil { return err } if detach { return nil } + if tty { + if err := HandleConsoleResize(ctx, process, con); err != nil { + logrus.WithError(err).Error("console resize") + } + } else { + sigc := commands.ForwardAllSignals(ctx, process) + defer commands.StopCatch(sigc) + } status := <-statusC code, _, err := status.Result() if err != nil {