Skip to content

Commit 9342ec6

Browse files
committed
ForwardAllSignals: check if channel is closed, and remove warning
Commit fff164c modified ForwardAllSignals to take `SIGURG` signals into account, which can be generated by the Go runtime on Go 1.14 and up as an interrupt to support pre-emptable system calls on Linux. With the updated code, the signal (`s`) would sometimes be `nil`, causing spurious (but otherwise harmless) warnings to be printed; Unsupported signal: <nil>. Discarding. To debug this issue, I patched v20.10.4 to handle `nil`, and added a debug line to print the signal in all cases; ```patch diff --git a/cli/command/container/signals.go b/cli/command/container/signals.go index 06e4d9e..0cb53ef06 100644 --- a/cli/command/container/signals.go +++ b/cli/command/container/signals.go @@ -22,8 +22,9 @@ func ForwardAllSignals(ctx context.Context, cli command.Cli, cid string, sigc <- case <-ctx.Done(): return } + fmt.Fprintf(cli.Err(), "Signal: %v\n", s) if s == signal.SIGCHLD || s == signal.SIGPIPE { ``` When running a cross-compiled macOS binary with Go 1.13 (`make -f docker.Makefile binary-osx`): # regular "docker run" (note that the `<nil>` signal only happens "sometimes"): ./build/docker run --rm alpine/git clone https://github.com/docker/getting-started.git Cloning into 'getting-started'... Signal: <nil> # when cancelling with CTRL-C: ./build/docker run --rm alpine/git clone https://github.com/docker/getting-started.git ^CSignal: interrupt Cloning into 'getting-started'... error: could not lock config file /git/getting-started/.git/config: No such file or directory fatal: could not set 'core.repositoryformatversion' to '0' Signal: <nil> Signal: <nil> When running a macOS binary built with Go 1.15 (`DISABLE_WARN_OUTSIDE_CONTAINER=1 make binary`): # regular "docker run" (note that the `<nil>` signal only happens "sometimes"): # this is the same as on Go 1.13 ./build/docker run --rm alpine/git clone https://github.com/docker/getting-started.git Cloning into 'getting-started'... Signal: <nil> # when cancelling with CTRL-C: ./build/docker run --rm alpine/git clone https://github.com/docker/getting-started.git Cloning into 'getting-started'... ^CSignal: interrupt Signal: urgent I/O condition Signal: urgent I/O condition fatal: --stdin requires a git repository fatal: index-pack failed Signal: <nil> Signal: <nil> This patch checks if the channel is closed, and removes the warning (to prevent warnings if new signals are added that are not in our known list of signals) We should also consider updating `notfiyAllSignals()`, which currently forwards _all_ signals (`signal.Notify(sigc)` without passing a list of signals), and instead pass it "all signals _minus_ the signals we don't want forwarded": https://github.com/docker/cli/blob/35f023a7c22a51867fb099d29006ef27379bc7fe/cli/command/container/signals.go#L55 Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent 70a0015 commit 9342ec6

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

cli/command/container/signals.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package container
22

33
import (
44
"context"
5-
"fmt"
65
"os"
76
gosignal "os/signal"
87

@@ -15,10 +14,16 @@ import (
1514
//
1615
// The channel you pass in must already be setup to receive any signals you want to forward.
1716
func ForwardAllSignals(ctx context.Context, cli command.Cli, cid string, sigc <-chan os.Signal) {
18-
var s os.Signal
17+
var (
18+
s os.Signal
19+
ok bool
20+
)
1921
for {
2022
select {
21-
case s = <-sigc:
23+
case s, ok = <-sigc:
24+
if !ok {
25+
return
26+
}
2227
case <-ctx.Done():
2328
return
2429
}
@@ -40,7 +45,6 @@ func ForwardAllSignals(ctx context.Context, cli command.Cli, cid string, sigc <-
4045
}
4146
}
4247
if sig == "" {
43-
fmt.Fprintf(cli.Err(), "Unsupported signal: %v. Discarding.\n", s)
4448
continue
4549
}
4650

0 commit comments

Comments
 (0)