From 1e9303b1efbd9ea8b1bea9a7ad06c2f9aac1a345 Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 13 Sep 2025 23:55:47 +0800 Subject: [PATCH] refactor(docker): update ListContainers function to accept context and improve timeout handling --- internal/docker/list_containers.go | 7 +------ internal/route/provider/docker.go | 12 ++++++------ internal/route/provider/provider.go | 6 ++++++ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/internal/docker/list_containers.go b/internal/docker/list_containers.go index 517b59d8..e1a98e52 100644 --- a/internal/docker/list_containers.go +++ b/internal/docker/list_containers.go @@ -2,8 +2,6 @@ package docker import ( "context" - "errors" - "time" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" @@ -21,16 +19,13 @@ var listOptions = container.ListOptions{ All: true, } -func ListContainers(clientHost string) ([]container.Summary, error) { +func ListContainers(ctx context.Context, clientHost string) ([]container.Summary, error) { dockerClient, err := NewClient(clientHost) if err != nil { return nil, err } defer dockerClient.Close() - ctx, cancel := context.WithTimeoutCause(context.Background(), 3*time.Second, errors.New("list containers timeout")) - defer cancel() - containers, err := dockerClient.ContainerList(ctx, listOptions) if err != nil { return nil, err diff --git a/internal/route/provider/docker.go b/internal/route/provider/docker.go index 55c72572..25fe921e 100755 --- a/internal/route/provider/docker.go +++ b/internal/route/provider/docker.go @@ -1,14 +1,14 @@ package provider import ( + "context" "fmt" "strconv" + "time" - "github.com/docker/docker/client" "github.com/goccy/go-yaml" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/docker" "github.com/yusing/go-proxy/internal/gperr" "github.com/yusing/go-proxy/internal/route" @@ -31,9 +31,6 @@ const ( var ErrAliasRefIndexOutOfRange = gperr.New("index out of range") func DockerProviderImpl(name, dockerHost string) ProviderImpl { - if dockerHost == common.DockerHostFromEnv { - dockerHost = common.GetEnvString("DOCKER_HOST", client.DefaultDockerHost) - } return &DockerProvider{ name, dockerHost, @@ -62,7 +59,10 @@ func (p *DockerProvider) NewWatcher() watcher.Watcher { } func (p *DockerProvider) loadRoutesImpl() (route.Routes, gperr.Error) { - containers, err := docker.ListContainers(p.dockerHost) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + containers, err := docker.ListContainers(ctx, p.dockerHost) if err != nil { return nil, gperr.Wrap(err) } diff --git a/internal/route/provider/provider.go b/internal/route/provider/provider.go index 26356c14..7b4fedd5 100644 --- a/internal/route/provider/provider.go +++ b/internal/route/provider/provider.go @@ -8,8 +8,10 @@ import ( "sync" "time" + "github.com/docker/docker/client" "github.com/rs/zerolog" "github.com/yusing/go-proxy/agent/pkg/agent" + "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/docker" "github.com/yusing/go-proxy/internal/gperr" "github.com/yusing/go-proxy/internal/route" @@ -67,6 +69,10 @@ func NewFileProvider(filename string) (p *Provider, err error) { } func NewDockerProvider(name string, dockerHost string) *Provider { + if dockerHost == common.DockerHostFromEnv { + dockerHost = common.GetEnvString("DOCKER_HOST", client.DefaultDockerHost) + } + p := newProvider(provider.ProviderTypeDocker) p.ProviderImpl = DockerProviderImpl(name, dockerHost) p.watcher = p.NewWatcher()