diff --git a/daemon/daemon.go b/daemon/daemon.go index b1e3f88329..be4c12d4e9 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -48,6 +48,7 @@ import ( "github.com/docker/docker/dockerversion" "github.com/docker/docker/errdefs" "github.com/docker/docker/image" + "github.com/docker/docker/internal/compatcontext" "github.com/docker/docker/layer" libcontainerdtypes "github.com/docker/docker/libcontainerd/types" "github.com/docker/docker/libnetwork" @@ -1212,14 +1213,16 @@ func (daemon *Daemon) waitForStartupDone() { } func (daemon *Daemon) shutdownContainer(c *container.Container) error { + ctx := compatcontext.WithoutCancel(context.TODO()) + // If container failed to exit in stopTimeout seconds of SIGTERM, then using the force - if err := daemon.containerStop(context.TODO(), c, containertypes.StopOptions{}); err != nil { + if err := daemon.containerStop(ctx, c, containertypes.StopOptions{}); err != nil { return fmt.Errorf("Failed to stop container %s with error: %v", c.ID, err) } // Wait without timeout for the container to exit. // Ignore the result. - <-c.Wait(context.Background(), container.WaitConditionNotRunning) + <-c.Wait(ctx, container.WaitConditionNotRunning) return nil } diff --git a/daemon/stop.go b/daemon/stop.go index 93d975a3c8..3be13d80fb 100644 --- a/daemon/stop.go +++ b/daemon/stop.go @@ -9,6 +9,7 @@ import ( "github.com/docker/docker/api/types/events" "github.com/docker/docker/container" "github.com/docker/docker/errdefs" + "github.com/docker/docker/internal/compatcontext" "github.com/moby/sys/signal" "github.com/pkg/errors" ) @@ -41,13 +42,12 @@ func (daemon *Daemon) ContainerStop(ctx context.Context, name string, options co return nil } -// containerStop sends a stop signal, waits, sends a kill signal. -func (daemon *Daemon) containerStop(_ context.Context, ctr *container.Container, options containertypes.StopOptions) (retErr error) { - // Deliberately using a local context here, because cancelling the - // request should not cancel the stop. - // - // TODO(thaJeztah): pass context, and use context.WithoutCancel() once available: https://github.com/golang/go/issues/40221 - ctx := context.Background() +// containerStop sends a stop signal, waits, sends a kill signal. It uses +// a [context.WithoutCancel], so cancelling the context does not cancel +// the request to stop the container. +func (daemon *Daemon) containerStop(ctx context.Context, ctr *container.Container, options containertypes.StopOptions) (retErr error) { + // Cancelling the request should not cancel the stop. + ctx = compatcontext.WithoutCancel(ctx) if !ctr.IsRunning() { return nil