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" +}