mirror of
https://github.com/docker/compose.git
synced 2025-09-25 18:48:47 +02:00
dectect if piped run command and disable tty if so
Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com>
This commit is contained in:
parent
da72230c39
commit
d07c437ce8
@ -183,7 +183,11 @@ func runCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) *
|
|||||||
} else {
|
} else {
|
||||||
options.noTty = !ttyFlag
|
options.noTty = !ttyFlag
|
||||||
}
|
}
|
||||||
|
} else if !cmd.Flags().Changed("no-TTY") && !cmd.Flags().Changed("interactive") && !dockerCli.In().IsTerminal() {
|
||||||
|
// Check if the command was piped or not, if so, force noTty to tru
|
||||||
|
options.noTty = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.quiet {
|
if options.quiet {
|
||||||
progress.Mode = progress.ModeQuiet
|
progress.Mode = progress.ModeQuiet
|
||||||
devnull, err := os.Open(os.DevNull)
|
devnull, err := os.Open(os.DevNull)
|
||||||
|
@ -222,4 +222,60 @@ func TestLocalComposeRun(t *testing.T) {
|
|||||||
res := c.RunDockerComposeCmd(t, "-f", "./fixtures/run-test/compose.yaml", "run", "build", "echo", "hello world")
|
res := c.RunDockerComposeCmd(t, "-f", "./fixtures/run-test/compose.yaml", "run", "build", "echo", "hello world")
|
||||||
res.Assert(t, icmd.Expected{Out: "hello world"})
|
res.Assert(t, icmd.Expected{Out: "hello world"})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("compose run with piped input detection", func(t *testing.T) {
|
||||||
|
if composeStandaloneMode {
|
||||||
|
t.Skip("Skipping test compose with piped input detection in standalone mode")
|
||||||
|
}
|
||||||
|
// Test that piped input is properly detected and TTY is automatically disabled
|
||||||
|
// This tests the logic added in run.go that checks dockerCli.In().IsTerminal()
|
||||||
|
cmd := c.NewCmd("sh", "-c", "echo 'piped-content' | docker compose -f ./fixtures/run-test/piped-test.yaml run --rm piped-test")
|
||||||
|
res := icmd.RunCmd(cmd)
|
||||||
|
|
||||||
|
res.Assert(t, icmd.Expected{Out: "piped-content"})
|
||||||
|
res.Assert(t, icmd.Success)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("compose run piped input should not allocate TTY", func(t *testing.T) {
|
||||||
|
if composeStandaloneMode {
|
||||||
|
t.Skip("Skipping test compose with piped input detection in standalone mode")
|
||||||
|
}
|
||||||
|
// Test that when stdin is piped, the container correctly detects no TTY
|
||||||
|
// This verifies that the automatic noTty=true setting works correctly
|
||||||
|
cmd := c.NewCmd("sh", "-c", "echo '' | docker compose -f ./fixtures/run-test/piped-test.yaml run --rm tty-test")
|
||||||
|
res := icmd.RunCmd(cmd)
|
||||||
|
|
||||||
|
res.Assert(t, icmd.Expected{Out: "No TTY detected"})
|
||||||
|
res.Assert(t, icmd.Success)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("compose run piped input with explicit --tty should fail", func(t *testing.T) {
|
||||||
|
if composeStandaloneMode {
|
||||||
|
t.Skip("Skipping test compose with piped input detection in standalone mode")
|
||||||
|
}
|
||||||
|
// Test that explicitly requesting TTY with piped input fails with proper error message
|
||||||
|
// This should trigger the "input device is not a TTY" error
|
||||||
|
cmd := c.NewCmd("sh", "-c", "echo 'test' | docker compose -f ./fixtures/run-test/piped-test.yaml run --rm --tty piped-test")
|
||||||
|
res := icmd.RunCmd(cmd)
|
||||||
|
|
||||||
|
res.Assert(t, icmd.Expected{
|
||||||
|
ExitCode: 1,
|
||||||
|
Err: "the input device is not a TTY",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("compose run piped input with --no-TTY=false should fail", func(t *testing.T) {
|
||||||
|
if composeStandaloneMode {
|
||||||
|
t.Skip("Skipping test compose with piped input detection in standalone mode")
|
||||||
|
}
|
||||||
|
// Test that explicitly disabling --no-TTY (i.e., requesting TTY) with piped input fails
|
||||||
|
// This should also trigger the "input device is not a TTY" error
|
||||||
|
cmd := c.NewCmd("sh", "-c", "echo 'test' | docker compose -f ./fixtures/run-test/piped-test.yaml run --rm --no-TTY=false piped-test")
|
||||||
|
res := icmd.RunCmd(cmd)
|
||||||
|
|
||||||
|
res.Assert(t, icmd.Expected{
|
||||||
|
ExitCode: 1,
|
||||||
|
Err: "the input device is not a TTY",
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
9
pkg/e2e/fixtures/run-test/piped-test.yaml
Normal file
9
pkg/e2e/fixtures/run-test/piped-test.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
services:
|
||||||
|
piped-test:
|
||||||
|
image: alpine
|
||||||
|
command: cat
|
||||||
|
# Service that will receive piped input and echo it back
|
||||||
|
tty-test:
|
||||||
|
image: alpine
|
||||||
|
command: sh -c "if [ -t 0 ]; then echo 'TTY detected'; else echo 'No TTY detected'; fi"
|
||||||
|
# Service to test TTY detection
|
Loading…
x
Reference in New Issue
Block a user