Add TERM env var to exec
When the `-t` flag is passed on exec make sure to add the TERM env var to mirror the expected configuration from run. Fixes #9299 Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
parent
cf58eb437c
commit
4633f15f13
|
@ -17,7 +17,9 @@ import (
|
||||||
"github.com/docker/docker/libcontainerd"
|
"github.com/docker/docker/libcontainerd"
|
||||||
"github.com/docker/docker/pkg/pools"
|
"github.com/docker/docker/pkg/pools"
|
||||||
"github.com/docker/docker/pkg/signal"
|
"github.com/docker/docker/pkg/signal"
|
||||||
|
"github.com/docker/docker/pkg/system"
|
||||||
"github.com/docker/docker/pkg/term"
|
"github.com/docker/docker/pkg/term"
|
||||||
|
"github.com/docker/docker/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Seconds to wait after sending TERM before trying KILL
|
// Seconds to wait after sending TERM before trying KILL
|
||||||
|
@ -121,6 +123,13 @@ func (d *Daemon) ContainerExecCreate(name string, config *types.ExecConfig) (str
|
||||||
execConfig.Tty = config.Tty
|
execConfig.Tty = config.Tty
|
||||||
execConfig.Privileged = config.Privileged
|
execConfig.Privileged = config.Privileged
|
||||||
execConfig.User = config.User
|
execConfig.User = config.User
|
||||||
|
execConfig.Env = []string{
|
||||||
|
"PATH=" + system.DefaultPathEnv,
|
||||||
|
}
|
||||||
|
if config.Tty {
|
||||||
|
execConfig.Env = append(execConfig.Env, "TERM=xterm")
|
||||||
|
}
|
||||||
|
execConfig.Env = utils.ReplaceOrAppendEnvValues(execConfig.Env, container.Config.Env)
|
||||||
if len(execConfig.User) == 0 {
|
if len(execConfig.User) == 0 {
|
||||||
execConfig.User = container.Config.User
|
execConfig.User = container.Config.User
|
||||||
}
|
}
|
||||||
|
@ -195,6 +204,7 @@ func (d *Daemon) ContainerExecStart(ctx context.Context, name string, stdin io.R
|
||||||
|
|
||||||
p := libcontainerd.Process{
|
p := libcontainerd.Process{
|
||||||
Args: append([]string{ec.Entrypoint}, ec.Args...),
|
Args: append([]string{ec.Entrypoint}, ec.Args...),
|
||||||
|
Env: ec.Env,
|
||||||
Terminal: ec.Tty,
|
Terminal: ec.Tty,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ type Config struct {
|
||||||
Tty bool
|
Tty bool
|
||||||
Privileged bool
|
Privileged bool
|
||||||
User string
|
User string
|
||||||
|
Env []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConfig initializes the a new exec configuration
|
// NewConfig initializes the a new exec configuration
|
||||||
|
|
|
@ -68,3 +68,26 @@ func (s *DockerSuite) TestExecTTY(c *check.C) {
|
||||||
c.Assert(err, checker.IsNil)
|
c.Assert(err, checker.IsNil)
|
||||||
c.Assert(bytes.Contains(buf, []byte("hello")), checker.Equals, true, check.Commentf(string(buf[:read])))
|
c.Assert(bytes.Contains(buf, []byte("hello")), checker.Equals, true, check.Commentf(string(buf[:read])))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test the the TERM env var is set when -t is provided on exec
|
||||||
|
func (s *DockerSuite) TestExecWithTERM(c *check.C) {
|
||||||
|
testRequires(c, DaemonIsLinux, SameHostDaemon)
|
||||||
|
out, _ := dockerCmd(c, "run", "-id", "busybox", "/bin/cat")
|
||||||
|
contID := strings.TrimSpace(out)
|
||||||
|
cmd := exec.Command(dockerBinary, "exec", "-t", contID, "sh", "-c", "if [ -z $TERM ]; then exit 1; else exit 0; fi")
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
c.Assert(err, checker.IsNil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that the TERM env var is not set on exec when -t is not provided, even if it was set
|
||||||
|
// on run
|
||||||
|
func (s *DockerSuite) TestExecWithNoTERM(c *check.C) {
|
||||||
|
testRequires(c, DaemonIsLinux, SameHostDaemon)
|
||||||
|
out, _ := dockerCmd(c, "run", "-itd", "busybox", "/bin/cat")
|
||||||
|
contID := strings.TrimSpace(out)
|
||||||
|
cmd := exec.Command(dockerBinary, "exec", contID, "sh", "-c", "if [ -z $TERM ]; then exit 0; else exit 1; fi")
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
c.Assert(err, checker.IsNil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue