docker_cli_exec_unix_test.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //go:build !windows
  2. // +build !windows
  3. package main
  4. import (
  5. "bytes"
  6. "io"
  7. "os/exec"
  8. "strings"
  9. "testing"
  10. "time"
  11. "github.com/creack/pty"
  12. "gotest.tools/v3/assert"
  13. )
  14. // regression test for #12546
  15. func (s *DockerCLIExecSuite) TestExecInteractiveStdinClose(c *testing.T) {
  16. testRequires(c, DaemonIsLinux)
  17. out, _ := dockerCmd(c, "run", "-itd", "busybox", "/bin/cat")
  18. contID := strings.TrimSpace(out)
  19. cmd := exec.Command(dockerBinary, "exec", "-i", contID, "echo", "-n", "hello")
  20. p, err := pty.Start(cmd)
  21. assert.NilError(c, err)
  22. b := bytes.NewBuffer(nil)
  23. ch := make(chan error, 1)
  24. go func() { ch <- cmd.Wait() }()
  25. select {
  26. case err := <-ch:
  27. assert.NilError(c, err)
  28. io.Copy(b, p)
  29. p.Close()
  30. bs := b.Bytes()
  31. bs = bytes.Trim(bs, "\x00")
  32. output := string(bs[:])
  33. assert.Equal(c, strings.TrimSpace(output), "hello")
  34. case <-time.After(5 * time.Second):
  35. p.Close()
  36. c.Fatal("timed out running docker exec")
  37. }
  38. }
  39. func (s *DockerCLIExecSuite) TestExecTTY(c *testing.T) {
  40. testRequires(c, DaemonIsLinux, testEnv.IsLocalDaemon)
  41. dockerCmd(c, "run", "-d", "--name=test", "busybox", "sh", "-c", "echo hello > /foo && top")
  42. cmd := exec.Command(dockerBinary, "exec", "-it", "test", "sh")
  43. p, err := pty.Start(cmd)
  44. assert.NilError(c, err)
  45. defer p.Close()
  46. _, err = p.Write([]byte("cat /foo && exit\n"))
  47. assert.NilError(c, err)
  48. chErr := make(chan error, 1)
  49. go func() {
  50. chErr <- cmd.Wait()
  51. }()
  52. select {
  53. case err := <-chErr:
  54. assert.NilError(c, err)
  55. case <-time.After(3 * time.Second):
  56. c.Fatal("timeout waiting for exec to exit")
  57. }
  58. buf := make([]byte, 256)
  59. read, err := p.Read(buf)
  60. assert.NilError(c, err)
  61. assert.Assert(c, bytes.Contains(buf, []byte("hello")), string(buf[:read]))
  62. }
  63. // Test the TERM env var is set when -t is provided on exec
  64. func (s *DockerCLIExecSuite) TestExecWithTERM(c *testing.T) {
  65. testRequires(c, DaemonIsLinux, testEnv.IsLocalDaemon)
  66. out, _ := dockerCmd(c, "run", "-id", "busybox", "/bin/cat")
  67. contID := strings.TrimSpace(out)
  68. cmd := exec.Command(dockerBinary, "exec", "-t", contID, "sh", "-c", "if [ -z $TERM ]; then exit 1; else exit 0; fi")
  69. if err := cmd.Run(); err != nil {
  70. assert.NilError(c, err)
  71. }
  72. }
  73. // Test that the TERM env var is not set on exec when -t is not provided, even if it was set
  74. // on run
  75. func (s *DockerCLIExecSuite) TestExecWithNoTERM(c *testing.T) {
  76. testRequires(c, DaemonIsLinux, testEnv.IsLocalDaemon)
  77. out, _ := dockerCmd(c, "run", "-itd", "busybox", "/bin/cat")
  78. contID := strings.TrimSpace(out)
  79. cmd := exec.Command(dockerBinary, "exec", contID, "sh", "-c", "if [ -z $TERM ]; then exit 0; else exit 1; fi")
  80. if err := cmd.Run(); err != nil {
  81. assert.NilError(c, err)
  82. }
  83. }