DockerCLI/cli/command/container
Sebastiaan van Stijn 032e485e1c
ForwardAllSignals: check if channel is closed, and remove warning
Commit fff164c22e 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 06e4d9eb6..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":
35f023a7c2/cli/command/container/signals.go (L55)

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
(cherry picked from commit 9342ec6b71)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2021-05-25 12:36:29 +02:00
..
testdata formatter: reduce minimum width for columns in table-view 2020-08-31 16:31:15 +02:00
attach.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
attach_test.go Replace deprecated Cobra command.SetOutput() with command.SetOut() 2020-05-07 14:25:59 +02:00
client_test.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
cmd.go Update gometalinter 2017-10-26 12:21:02 -04:00
commit.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
cp.go Prevent overwriting irregular files (cp, save, export commands) 2019-02-07 09:17:35 +01:00
cp_test.go bump gotest.tools v3.0.1 for compatibility with Go 1.14 2020-02-23 00:28:55 +01:00
create.go Set platform on container create API. 2020-05-27 17:16:56 -07:00
create_test.go Set platform on container create API. 2020-05-27 17:16:56 -07:00
diff.go formatter package heavy refactoring 2018-10-23 17:05:44 +02:00
exec.go Added env-file flag to docker exec 2020-06-29 18:32:44 -04:00
exec_test.go Added env-file flag to docker exec 2020-06-29 18:32:44 -04:00
export.go Prevent overwriting irregular files (cp, save, export commands) 2019-02-07 09:17:35 +01:00
export_test.go Replace deprecated Cobra command.SetOutput() with command.SetOut() 2020-05-07 14:25:59 +02:00
formatter_diff.go formatter package heavy refactoring 2018-10-23 17:05:44 +02:00
formatter_diff_test.go formatter: reduce minimum width for columns in table-view 2020-08-31 16:31:15 +02:00
formatter_stats.go formatter: minor refactor to reduce needless conversions 2020-08-28 23:09:27 +02:00
formatter_stats_test.go formatter: reduce minimum width for columns in table-view 2020-08-31 16:31:15 +02:00
hijack.go update docker, replace github.com/docker/pkg/term, github.com/docker/pkg/mount 2020-04-22 17:16:13 +02:00
inspect.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
kill.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
list.go Replace 'numeric' with object in -q description 2020-03-02 10:28:52 +01:00
list_test.go Replace deprecated Cobra command.SetOutput() with command.SetOut() 2020-05-07 14:25:59 +02:00
logs.go Add shorthand for --tail option 2020-07-23 15:25:12 +03:00
logs_test.go bump gotest.tools v3.0.1 for compatibility with Go 1.14 2020-02-23 00:28:55 +01:00
opts.go docker run: specify cgroup namespace mode with --cgroupns 2020-01-29 22:50:37 +00:00
opts_test.go refactor opts tests 2020-07-01 14:45:47 +02:00
pause.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
port.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
prune.go build: add options to builder prune 2018-09-05 00:01:16 +00:00
rename.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
restart.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
rm.go Return zero exit-code when force-removing non-existing containers 2020-08-14 16:17:40 +02:00
rm_test.go Return zero exit-code when force-removing non-existing containers 2020-08-14 16:17:40 +02:00
run.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
run_test.go Set platform on container create API. 2020-05-27 17:16:56 -07:00
signals.go ForwardAllSignals: check if channel is closed, and remove warning 2021-05-25 12:36:29 +02:00
signals_linux.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
signals_linux_test.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
signals_notlinux.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
signals_test.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
start.go Fix `docker start` blocking on signal handling 2021-05-25 12:35:59 +02:00
stats.go cli/command/container/stats.go: fix goimports 2020-11-10 17:47:57 +01:00
stats_helpers.go calculateMemUsageUnixNoCache: subtract total_inactive_file, not cache 2020-04-11 08:13:21 +09:00
stats_helpers_test.go calculateMemUsageUnixNoCache: subtract total_inactive_file, not cache 2020-04-11 08:13:21 +09:00
stats_unit_test.go use char to check blockIO type 2019-03-11 10:01:22 +08:00
stop.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
top.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
tty.go Revert "[20.10] Revert "Ignore SIGURG on Linux."" 2021-05-25 12:30:31 +02:00
tty_test.go bump gotest.tools v3.0.1 for compatibility with Go 1.14 2020-02-23 00:28:55 +01:00
unpause.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
update.go Add `--pids-limit` flag to `docker update` 2019-03-21 01:20:32 +01:00
utils.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00
utils_test.go bump gotest.tools v3.0.1 for compatibility with Go 1.14 2020-02-23 00:28:55 +01:00
wait.go Switch from x/net/context to context 2018-05-11 16:49:43 -07:00