55 lines
957 B
Go
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))
|
|
}
|
|
}()
|
|
}
|