diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index b5677911d9d1..dad1350d92b5 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -1461,7 +1461,7 @@ func (d *Driver) SignalTask(taskID string, signal string) error { return fmt.Errorf("failed to parse signal: %v", err) } - return h.Signal(sig) + return h.Signal(context.Background(), sig) } func (d *Driver) ExecTask(taskID string, cmd []string, timeout time.Duration) (*drivers.ExecTaskResult, error) { diff --git a/drivers/docker/handle.go b/drivers/docker/handle.go index 3e1854a76572..6a75603f79f6 100644 --- a/drivers/docker/handle.go +++ b/drivers/docker/handle.go @@ -103,7 +103,7 @@ func (h *taskHandle) Exec(ctx context.Context, cmd string, args []string) (*driv return execResult, nil } -func (h *taskHandle) Signal(s os.Signal) error { +func (h *taskHandle) Signal(ctx context.Context, s os.Signal) error { // Convert types sysSig, ok := s.(syscall.Signal) if !ok { @@ -116,8 +116,9 @@ func (h *taskHandle) Signal(s os.Signal) error { dockerSignal := docker.Signal(sysSig) opts := docker.KillContainerOptions{ - ID: h.containerID, - Signal: dockerSignal, + ID: h.containerID, + Signal: dockerSignal, + Context: ctx, } return h.client.KillContainer(opts) @@ -127,7 +128,10 @@ func (h *taskHandle) Signal(s os.Signal) error { func (h *taskHandle) Kill(killTimeout time.Duration, signal os.Signal) error { // Only send signal if killTimeout is set, otherwise stop container if killTimeout > 0 { - if err := h.Signal(signal); err != nil { + ctx, cancel := context.WithTimeout(context.Background(), killTimeout) + defer cancel() + + if err := h.Signal(ctx, signal); err != nil { // Container has already been removed. if strings.Contains(err.Error(), NoSuchContainerError) { h.logger.Debug("attempted to signal nonexistent container") @@ -146,7 +150,7 @@ func (h *taskHandle) Kill(killTimeout time.Duration, signal os.Signal) error { select { case <-h.waitCh: return nil - case <-time.After(killTimeout): + case <-ctx.Done(): } }