fix(runner): 解决job容器无法访问缓存服务器的问题
Some checks failed
release-nightly / goreleaser (push) Failing after 1m32s
release-nightly / release-image (map[tag_suffix:-dind target:dind]) (push) Has been cancelled
release-nightly / release-image (map[tag_suffix:-dind-rootless target:dind-rootless]) (push) Has been cancelled
release-nightly / release-image (map[tag_suffix: target:basic]) (push) Has been cancelled
checks / check and test (push) Has been cancelled

- 修改cache URL设置逻辑,将原始URL转换为可通过宿主机网关访问的地址
- 添加从原始URL中提取端口并替换为宿主机网关IP的功能
- 实现getGatewayIP函数获取容器网络中的宿主机网关IP
- 添加日志记录原始URL和最终使用的缓存URL便于调试
- 支持通过配置文件指定固定的缓存host地址
- 使用172.17.0.1作为Docker默认bridge网络的网关地址
This commit is contained in:
dcsunny
2026-01-30 10:49:05 +08:00
parent 90d11b8692
commit d3ce144350

View File

@@ -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) log.Errorf("cannot init cache server, it will be disabled: %v", err)
// go on // go on
} else { } 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]
}
// 使用宿主机网关IPjob容器可以通过网关访问宿主机服务
// 通常Docker网络的网关是 x.x.x.1job容器可以通过这个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, 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 socketDocker在宿主机上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"
}