From d3ce144350fab30a48822ada4456150e43c18be4 Mon Sep 17 00:00:00 2001 From: dcsunny <934831065@qq.com> Date: Fri, 30 Jan 2026 10:49:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(runner):=20=E8=A7=A3=E5=86=B3job=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E6=97=A0=E6=B3=95=E8=AE=BF=E9=97=AE=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改cache URL设置逻辑,将原始URL转换为可通过宿主机网关访问的地址 - 添加从原始URL中提取端口并替换为宿主机网关IP的功能 - 实现getGatewayIP函数获取容器网络中的宿主机网关IP - 添加日志记录原始URL和最终使用的缓存URL便于调试 - 支持通过配置文件指定固定的缓存host地址 - 使用172.17.0.1作为Docker默认bridge网络的网关地址 --- internal/app/run/runner.go | 44 +++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/internal/app/run/runner.go b/internal/app/run/runner.go index 4b0f76b..d0dd9d2 100644 --- a/internal/app/run/runner.go +++ b/internal/app/run/runner.go @@ -66,7 +66,29 @@ func NewRunner(cfg *config.Config, reg *config.Registration, cli client.Client) log.Errorf("cannot init cache server, it will be disabled: %v", err) // go on } else { - envs["ACTIONS_CACHE_URL"] = cacheHandler.ExternalURL() + "/" + // 获取缓存服务器的外部URL + originalURL := cacheHandler.ExternalURL() + log.Infof("Cache server ExternalURL: %s", originalURL) + + // 从原始URL中提取端口,并使用宿主机网关IP + // job容器在不同网络中,需要通过宿主机网关访问缓存服务器 + cacheURL := originalURL + if strings.HasPrefix(originalURL, "http://") { + parts := strings.Split(originalURL, ":") + if len(parts) >= 3 { + port := parts[len(parts)-1] + // 移除可能的路径部分 + if idx := strings.Index(port, "/"); idx != -1 { + port = port[:idx] + } + // 使用宿主机网关IP(job容器可以通过网关访问宿主机服务) + // 通常Docker网络的网关是 x.x.x.1,job容器可以通过这个IP访问宿主机 + cacheURL = fmt.Sprintf("http://%s:%s", getGatewayIP(cfg), port) + } + } + + log.Infof("Using cache URL for job containers: %s", cacheURL) + envs["ACTIONS_CACHE_URL"] = cacheURL + "/" } } } @@ -255,3 +277,23 @@ func (r *Runner) Declare(ctx context.Context, labels []string) (*connect.Respons Labels: labels, })) } + +// getGatewayIP 获取宿主机在容器网络中的网关IP +// job容器可以通过网关IP访问宿主机上的服务 +func getGatewayIP(cfg *config.Config) string { + // 如果配置了固定的缓存host,使用它 + if cfg.Cache.Host != "" && cfg.Cache.Host != "0.0.0.0" && cfg.Cache.Host != "::" { + return cfg.Cache.Host + } + + // 根据Docker主机类型返回合适的网关IP + // 1. 如果使用 unix socket,Docker在宿主机上,job容器通过网关访问 + // 2. 大多数Docker网络的网关是 x.x.x.1 + // 3. 常见的Docker bridge网络: + // - docker0 (默认): 172.17.0.1 + // - 自定义网络: 172.x.x.1 或 192.168.x.x.1 + // + // 使用172.17.0.1作为默认值,这是Docker默认bridge网络的网关 + // job容器创建的独立网络通常也是172.x.x.1网关 + return "172.17.0.1" +}