diff --git a/cmd/ctr/commands/run/run.go b/cmd/ctr/commands/run/run.go index da91429cc..935730259 100644 --- a/cmd/ctr/commands/run/run.go +++ b/cmd/ctr/commands/run/run.go @@ -135,9 +135,17 @@ var Command = cli.Command{ if context.Bool("rm") && !detach { defer container.Delete(ctx, containerd.WithSnapshotCleanup) } + var con console.Console + if tty { + con = console.Current() + defer con.Reset() + if err := con.SetRaw(); err != nil { + return err + } + } opts := getNewTaskOpts(context) ioOpts := []cio.Opt{cio.WithFIFODir(context.String("fifo-dir"))} - task, err := tasks.NewTask(ctx, client, container, context.String("checkpoint"), tty, context.Bool("null-io"), ioOpts, opts...) + task, err := tasks.NewTask(ctx, client, container, context.String("checkpoint"), con, context.Bool("null-io"), ioOpts, opts...) if err != nil { return err } @@ -153,14 +161,6 @@ var Command = 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 err := task.Start(ctx); err != nil { return err } diff --git a/cmd/ctr/commands/tasks/start.go b/cmd/ctr/commands/tasks/start.go index 63694a2e1..089caa6f2 100644 --- a/cmd/ctr/commands/tasks/start.go +++ b/cmd/ctr/commands/tasks/start.go @@ -65,13 +65,21 @@ var startCommand = cli.Command{ if err != nil { return err } - var ( tty = spec.Process.Terminal opts = getNewTaskOpts(context) ioOpts = []cio.Opt{cio.WithFIFODir(context.String("fifo-dir"))} ) - task, err := NewTask(ctx, client, container, "", tty, context.Bool("null-io"), ioOpts, opts...) + var con console.Console + if tty { + con = console.Current() + defer con.Reset() + if err := con.SetRaw(); err != nil { + return err + } + } + + task, err := NewTask(ctx, client, container, "", con, context.Bool("null-io"), ioOpts, opts...) if err != nil { return err } @@ -86,14 +94,6 @@ var startCommand = 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 err := task.Start(ctx); err != nil { return err } diff --git a/cmd/ctr/commands/tasks/tasks_unix.go b/cmd/ctr/commands/tasks/tasks_unix.go index f7b111410..e10fe798d 100644 --- a/cmd/ctr/commands/tasks/tasks_unix.go +++ b/cmd/ctr/commands/tasks/tasks_unix.go @@ -67,7 +67,7 @@ func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Consol } // NewTask creates a new task -func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, checkpoint string, tty, nullIO bool, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { +func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, checkpoint string, con console.Console, nullIO bool, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { stdio := cio.NewCreator(append([]cio.Opt{cio.WithStdio}, ioOpts...)...) if checkpoint != "" { im, err := client.GetImage(ctx, checkpoint) @@ -77,11 +77,11 @@ func NewTask(ctx gocontext.Context, client *containerd.Client, container contain opts = append(opts, containerd.WithTaskCheckpoint(im)) } ioCreator := stdio - if tty { - ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStdio, cio.WithTerminal}, ioOpts...)...) + if con != nil { + ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStreams(con, con, nil), cio.WithTerminal}, ioOpts...)...) } if nullIO { - if tty { + if con != nil { return nil, errors.New("tty and null-io cannot be used together") } ioCreator = cio.NullIO diff --git a/cmd/ctr/commands/tasks/tasks_windows.go b/cmd/ctr/commands/tasks/tasks_windows.go index 5235467fc..f6ec5563a 100644 --- a/cmd/ctr/commands/tasks/tasks_windows.go +++ b/cmd/ctr/commands/tasks/tasks_windows.go @@ -58,13 +58,13 @@ func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Consol } // NewTask creates a new task -func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, _ string, tty, nullIO bool, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { +func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, _ string, con console.Console, nullIO bool, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { var ioCreator cio.Creator - if tty { + if con != nil { if nullIO { return nil, errors.New("tty and null-io cannot be used together") } - ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStdio, cio.WithTerminal}, ioOpts...)...) + ioCreator = cio.NewCreator(append([]cio.Opt{cio.WithStreams(con, con, con), cio.WithTerminal}, ioOpts...)...) } else if nullIO { ioCreator = cio.NullIO } else {