diff --git a/agent/dockerclient/dockerapi/docker_client.go b/agent/dockerclient/dockerapi/docker_client.go index 4935d7d8b7c..c84cbc481ef 100644 --- a/agent/dockerclient/dockerapi/docker_client.go +++ b/agent/dockerclient/dockerapi/docker_client.go @@ -1393,6 +1393,10 @@ func (dg *dockerGoClient) Stats(ctx context.Context, id string, inactivityTimeou stream := true resp, err = client.ContainerStats(subCtx, id, stream) if err != nil { + if errors.Is(err, context.Canceled) { + // ignore context cancelled errors, which indicate container has exited already + return + } errC <- fmt.Errorf("DockerGoClient: Unable to retrieve stats for container %s: %v", id, err) return } @@ -1408,6 +1412,10 @@ func (dg *dockerGoClient) Stats(ctx context.Context, id string, inactivityTimeou data := new(types.StatsJSON) for err := decoder.Decode(data); err != io.EOF; err = decoder.Decode(data) { if err != nil { + if errors.Is(err, context.Canceled) { + // ignore context cancelled errors, which indicate container has exited already + return + } errC <- fmt.Errorf("DockerGoClient: Unable to decode stats for container %s: %v", id, err) return } @@ -1466,6 +1474,10 @@ func getContainerStatsNotStreamed(client sdkclient.Client, ctx context.Context, response := make(chan statsResponse, 1) go func() { stats, err := client.ContainerStats(ctxWithTimeout, id, false) + if errors.Is(err, context.Canceled) { + // ignore context cancelled errors, which indicate container has exited already + err = nil + } response <- statsResponse{stats, err} }() select {