Skip to content

Commit

Permalink
Update podman-remote run to handle detach keys
Browse files Browse the repository at this point in the history
addresses containers#7979

Signed-off-by: Andy Librian <[email protected]>
  • Loading branch information
andylibrian committed Oct 16, 2020
1 parent fe1b6cc commit 480cb2d
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 11 deletions.
52 changes: 41 additions & 11 deletions pkg/bindings/containers/attach.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/containers/podman/v2/pkg/bindings"
sig "github.com/containers/podman/v2/pkg/signal"
"github.com/containers/podman/v2/utils"
"github.com/moby/term"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/crypto/ssh/terminal"
Expand Down Expand Up @@ -60,8 +61,14 @@ func Attach(ctx context.Context, nameOrID string, detachKeys *string, logs, stre
}

params := url.Values{}
detachKeysInBytes := []byte{}
if detachKeys != nil {
params.Add("detachKeys", *detachKeys)

detachKeysInBytes, err = term.ToBytes(*detachKeys)
if err != nil {
return errors.Wrapf(err, "invalid detach keys")
}
}
if logs != nil {
params.Add("logs", fmt.Sprintf("%t", *logs))
Expand Down Expand Up @@ -141,27 +148,51 @@ func Attach(ctx context.Context, nameOrID string, detachKeys *string, logs, stre
attachReady <- true
}

stdoutChan := make(chan error)
stdinChan := make(chan error)

if isSet.stdin {
go func() {
logrus.Debugf("Copying STDIN to socket")
_, err := utils.CopyDetachable(socket, stdin, []byte{})
if err != nil {

_, err := utils.CopyDetachable(socket, stdin, detachKeysInBytes)

if err != nil && err != define.ErrDetach {
logrus.Error("failed to write input to service: " + err.Error())
}
stdinChan <- err
}()
}

buffer := make([]byte, 1024)
if ctnr.Config.Tty {
logrus.Debugf("Copying STDOUT of container in terminal mode")
go func() {
logrus.Debugf("Copying STDOUT of container in terminal mode")

if !isSet.stdout {
return fmt.Errorf("container %q requires stdout to be set", ctnr.ID)
}
// If not multiplex'ed, read from server and write to stdout
_, err := io.Copy(stdout, socket)
if err != nil {
return err
if !isSet.stdout {
stdoutChan <- fmt.Errorf("container %q requires stdout to be set", ctnr.ID)
}
// If not multiplex'ed, read from server and write to stdout
_, err := io.Copy(stdout, socket)

stdoutChan <- err
}()

for {
select {
case err := <-stdoutChan:
if err != nil {
return err
}

return nil
case err := <-stdinChan:
if err != nil {
return err
}

return nil
}
}
} else {
logrus.Debugf("Copying standard streams of container in non-terminal mode")
Expand Down Expand Up @@ -205,7 +236,6 @@ func Attach(ctx context.Context, nameOrID string, detachKeys *string, logs, stre
}
}
}
return nil
}

// DemuxHeader reads header for stream from server multiplexed stdin/stdout/stderr/2nd error channel
Expand Down
4 changes: 4 additions & 0 deletions pkg/domain/infra/tunnel/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,10 @@ func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.Conta

// Attach
if err := startAndAttach(ic, con.ID, &opts.DetachKeys, opts.InputStream, opts.OutputStream, opts.ErrorStream); err != nil {
if err == define.ErrDetach {
return &report, nil
}

report.ExitCode = define.ExitCode(err)
if opts.Rm {
if rmErr := containers.Remove(ic.ClientCxt, con.ID, bindings.PFalse, bindings.PTrue); rmErr != nil {
Expand Down

0 comments on commit 480cb2d

Please sign in to comment.