From 16d5d4b6e1e85b0e82059be6914a12374c3fc81c Mon Sep 17 00:00:00 2001 From: Cory Snider Date: Tue, 11 Apr 2023 20:18:25 -0400 Subject: cmd/dockerd: ignore SIGPIPE using signal.Ignore The fix to ignore SIGPIPE signals was originally added in the Go 1.4 era. signal.Ignore was first added in Go 1.5. Signed-off-by: Cory Snider --- cmd/dockerd/docker.go | 7 +++++++ cmd/dockerd/trap/trap.go | 11 ++--------- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'cmd') diff --git a/cmd/dockerd/docker.go b/cmd/dockerd/docker.go index da11a0cfdd..5b4d5f5c0f 100644 --- a/cmd/dockerd/docker.go +++ b/cmd/dockerd/docker.go @@ -3,6 +3,8 @@ package main import ( "fmt" "os" + "os/signal" + "syscall" "github.com/docker/docker/daemon/config" "github.com/docker/docker/dockerversion" @@ -77,6 +79,11 @@ func main() { return } + // Ignore SIGPIPE events. These are generated by systemd when journald is restarted while + // the docker daemon is not restarted and also running under systemd. + // Fixes https://github.com/docker/docker/issues/19728 + signal.Ignore(syscall.SIGPIPE) + // initial log formatting; this setting is updated after the daemon configuration is loaded. logrus.SetFormatter(&logrus.TextFormatter{ TimestampFormat: jsonmessage.RFC3339NanoFixed, diff --git a/cmd/dockerd/trap/trap.go b/cmd/dockerd/trap/trap.go index 1e88e66302..62cbfaf1ca 100644 --- a/cmd/dockerd/trap/trap.go +++ b/cmd/dockerd/trap/trap.go @@ -15,22 +15,15 @@ import ( // - If SIGINT or SIGTERM are received, `cleanup` is called, then the process is terminated. // - If SIGINT or SIGTERM are received 3 times before cleanup is complete, then cleanup is // skipped and the process is terminated immediately (allows force quit of stuck daemon) -// - Ignore SIGPIPE events. These are generated by systemd when journald is restarted while -// the docker daemon is not restarted and also running under systemd. -// Fixes https://github.com/docker/docker/issues/19728 func Trap(cleanup func(), logger interface { Info(args ...interface{}) }) { c := make(chan os.Signal, 1) - // we will handle INT, TERM, SIGPIPE here - signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGPIPE) + // we will handle INT, TERM here + signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { interruptCount := uint32(0) for sig := range c { - if sig == syscall.SIGPIPE { - continue - } - go func(sig os.Signal) { logger.Info(fmt.Sprintf("Processing signal '%v'", sig)) switch sig { -- cgit v1.2.1