2025-03-09 19:58:25 +01:00

55 lines
957 B
Go

package container
import (
"context"
"errors"
"io"
"log/slog"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters"
)
func handleEvents(
ctx context.Context,
containerID string,
apiClient DockerClient,
logger *slog.Logger,
ch chan events.Message,
) {
getEvents := func() (bool, error) {
recvC, errC := apiClient.Events(ctx, events.ListOptions{
Filters: filters.NewArgs(
filters.Arg("container", containerID),
filters.Arg("type", "container"),
),
})
for {
select {
case <-ctx.Done():
return false, ctx.Err()
case evt := <-recvC:
ch <- evt
case err := <-errC:
if ctx.Err() != nil || errors.Is(err, io.EOF) {
return false, err
}
return true, err
}
}
}
go func() {
for {
shouldRetry, err := getEvents()
if !shouldRetry {
break
}
logger.Warn("Error receiving Docker events", "err", err, "id", shortID(containerID))
}
}()
}