Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.vscode
.idea
ofelia
debug
build
Expand Down
52 changes: 42 additions & 10 deletions cli/docker_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"os"
"slices"
"strings"
"time"

Expand Down Expand Up @@ -86,18 +87,49 @@ func (c *DockerHandler) ConfigFromLabelsEnabled() bool {
return c.configsFromLabels
}

// Watch for Docker events and update the labels accordingly
func (c *DockerHandler) watch() {
const pollInterval = 10 * time.Second
c.logger.Debugf("Watching for Docker labels changes every %s...", pollInterval)
ticker := time.NewTicker(pollInterval)
defer ticker.Stop()
for range ticker.C {
labels, err := c.GetDockerLabels()
// Do not print or care if there is no container up right now
if err != nil && !errors.Is(err, errNoContainersMatchingFilters) {
c.logger.Debugf("%v", err)
c.logger.Debugf("Listening for Docker events to hot reload configs...")

events := make(chan *docker.APIEvents)
err := c.dockerClient.AddEventListener(events)
if err != nil {
c.logger.Errorf("Error adding event listener: %v", err)
}
defer func() {
// remove the listener when the program exits
err := c.dockerClient.RemoveEventListener(events)
if err != nil {
c.logger.Errorf("Error removing event listener: %v", err)
}
}()

lifecycleEvents := []string{
"create",
"start",
"restart",
"stop",
"kill",
"die",
"destroy",
}

otherManagementEvents := []string{
"pause",
"unpause",
"rename",
"update",
}

for event := range events {
if event.Type == "container" && (slices.Contains(lifecycleEvents, event.Action) || slices.Contains(otherManagementEvents, event.Action)) {
labels, err := c.GetDockerLabels()
// Do not print or care if there is no container up right now
if err != nil && !errors.Is(err, errNoContainersMatchingFilters) {
c.logger.Debugf("%v", err)
}
c.notifier.dockerLabelsUpdate(labels)
}
c.notifier.dockerLabelsUpdate(labels)
}
}

Expand Down
Loading