1
0
mirror of https://github.com/amir20/dozzle.git synced 2025-12-21 13:23:07 +01:00

fix: updates default timeout and adds user agent. see #3610 (#3611)

This commit is contained in:
Amir Raminfar
2025-02-09 14:13:31 -08:00
committed by GitHub
parent 7ae409981c
commit eba87fa49e
5 changed files with 32 additions and 22 deletions

View File

@@ -30,6 +30,7 @@ services:
- DOZZLE_FILTER=name=dozzle
- DOZZLE_NO_ANALYTICS=1
- DOZZLE_HOSTNAME=localhost
- DOZZLE_LEVEL=debug
ports:
- 7070:8080
build:

View File

@@ -26,6 +26,8 @@ type ContainerStore struct {
filter ContainerFilter
}
const defaultTimeout = 10 * time.Second
func NewContainerStore(ctx context.Context, client Client, filter ContainerFilter) *ContainerStore {
log.Debug().Str("host", client.Host().Name).Interface("filter", filter).Msg("initializing container store")
@@ -64,7 +66,7 @@ func (s *ContainerStore) checkConnectivity() error {
s.connected.Store(false)
}()
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // 3s is enough to fetch all containers
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel()
if containers, err := s.client.ListContainers(ctx, s.filter); err != nil {
return err
@@ -88,7 +90,7 @@ func (s *ContainerStore) checkConnectivity() error {
}
go func(c Container, i int) {
defer sem.Release(1)
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) // 2s is hardcoded timeout for fetching container
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel()
if container, err := s.client.FindContainer(ctx, c.ID); err == nil {
s.containers.Store(c.ID, &container)
@@ -114,22 +116,29 @@ func (s *ContainerStore) ListContainers(filter ContainerFilter) ([]Container, er
return nil, err
}
validContainers, err := s.client.ListContainers(s.ctx, filter)
if err != nil {
return nil, err
}
validIDMap := lo.KeyBy(validContainers, func(item Container) string {
return item.ID
})
containers := make([]Container, 0)
s.containers.Range(func(_ string, c *Container) bool {
if _, ok := validIDMap[c.ID]; ok {
containers = append(containers, *c)
if filter.Exists() {
validContainers, err := s.client.ListContainers(s.ctx, filter)
if err != nil {
return nil, err
}
return true
})
validIDMap := lo.KeyBy(validContainers, func(item Container) string {
return item.ID
})
s.containers.Range(func(_ string, c *Container) bool {
if _, ok := validIDMap[c.ID]; ok {
containers = append(containers, *c)
}
return true
})
} else {
s.containers.Range(func(_ string, c *Container) bool {
containers = append(containers, *c)
return true
})
}
return containers, nil
}
@@ -158,7 +167,7 @@ func (s *ContainerStore) FindContainer(id string, filter ContainerFilter) (Conta
log.Debug().Str("id", id).Msg("container doesn't have detailed information, fetching it")
if newContainer, ok := s.containers.Compute(id, func(c *Container, loaded bool) (*Container, bool) {
if loaded {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
defer cancel()
if newContainer, err := s.client.FindContainer(ctx, id); err == nil {
return &newContainer, false
@@ -237,7 +246,7 @@ func (s *ContainerStore) init() {
log.Trace().Str("event", event.Name).Str("id", event.ActorID).Msg("received container event")
switch event.Name {
case "start":
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
if container, err := s.client.FindContainer(ctx, event.ActorID); err == nil {
list, _ := s.client.ListContainers(ctx, s.filter)

View File

@@ -99,7 +99,7 @@ func (sc *StatsCollector) Start(parentCtx context.Context) bool {
ctx, sc.stopper = context.WithCancel(parentCtx)
sc.mu.Unlock()
timeoutCtx, cancel := context.WithTimeout(parentCtx, 3*time.Second) // 3 seconds to list containers is hard limit
timeoutCtx, cancel := context.WithTimeout(parentCtx, defaultTimeout)
if containers, err := sc.client.ListContainers(timeoutCtx, sc.filter); err == nil {
for _, c := range containers {
if c.State == "running" {

View File

@@ -69,7 +69,7 @@ func NewClient(cli DockerCLI, host container.Host) container.Client {
// NewClientWithFilters creates a new instance of Client with docker filters
func NewLocalClient(hostname string) (container.Client, error) {
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(), client.WithUserAgent("Docker-Client/Dozzle"))
if err != nil {
return nil, err
@@ -109,7 +109,7 @@ func NewRemoteClient(host container.Host) (container.Client, error) {
log.Debug().Msg("Not using TLS for remote client")
}
opts = append(opts, client.WithAPIVersionNegotiation())
opts = append(opts, client.WithAPIVersionNegotiation(), client.WithUserAgent("Docker-Client/Dozzle"))
cli, err := client.NewClientWithOpts(opts...)

View File

@@ -27,7 +27,7 @@ type Args struct {
RemoteAgent []string `arg:"env:DOZZLE_REMOTE_AGENT,--remote-agent,separate" help:"list of agents to connect remotely"`
NoAnalytics bool `arg:"--no-analytics,env:DOZZLE_NO_ANALYTICS" help:"disables anonymous analytics"`
Mode string `arg:"env:DOZZLE_MODE" default:"server" help:"sets the mode to run in (server, swarm)"`
TimeoutString string `arg:"--timeout,env:DOZZLE_TIMEOUT" default:"3s" help:"sets the timeout for docker client"`
TimeoutString string `arg:"--timeout,env:DOZZLE_TIMEOUT" default:"10s" help:"sets the timeout for docker client"`
Timeout time.Duration `arg:"-"`
Healthcheck *HealthcheckCmd `arg:"subcommand:healthcheck" help:"checks if the server is running"`
Generate *GenerateCmd `arg:"subcommand:generate" help:"generates a configuration file for simple auth"`