From a2c907079ab92d7f68ec78d2c195758d7ef92f6e Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 28 Sep 2026 16:56:07 +0200 Subject: [PATCH] Add the missing Docker events watcher Co-Authored-By: Claude Opus 5.5 --- docker.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docker.go b/docker.go index eb80209..247c284 100644 --- a/docker.go +++ b/docker.go @@ -170,6 +170,39 @@ func (m *DockerManager) Run(ctx context.Context) { } } +// watchEvents listens to container events (start, stop, removal…) so that a +// new container is followed right away instead of at the next periodic sync. +func (m *DockerManager) watchEvents(ctx context.Context) { + filters := url.QueryEscape(`{"type":["container"]}`) + for { + resp, err := m.get(ctx, "/events?filters="+filters) + if err != nil { + if ctx.Err() != nil { + return + } + m.setError(err) + sleepCtx(ctx, 5*time.Second) + continue + } + dec := json.NewDecoder(resp.Body) + for { + var ev struct{ Action string } + if err := dec.Decode(&ev); err != nil { + break + } + switch ev.Action { + case "create", "start", "die", "destroy", "rename": + m.requestSync() + } + } + resp.Body.Close() + if ctx.Err() != nil { + return + } + sleepCtx(ctx, time.Second) // stream cut (proxy timeout, Docker restart): reconnect + } +} + func (m *DockerManager) requestSync() { select { case m.syncCh <- struct{}{}: