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
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:
@@ -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]
|
||||||
|
}
|
||||||
|
// 使用宿主机网关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,
|
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"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user