我在连接到我的服务器时遇到问题,该服务器监听 Unix 域套接字。
Go 的 net/http
包似乎无法使用套接字路径连接到目标。
是否有更好的替代方案,而无需使用 net
创建我自己的 HTTP 协议(protocol)实现?
我找到了很多解决方案,例如 these , 但他们不合适
我试过:
_, err := http.Get("unix:///var/run/docker.sock")
(将 unix
更改为 path
/socket
。它总是提示不支持的协议(protocol)
最佳答案
你必须实现你自己的 RoundTripper支持 unix
套接字。
最简单的方法可能是只使用 http 而不是 unix 套接字与 docker 通信。
编辑初始化脚本,添加-H tcp://127.0.0.1:xxxx
,例如:
/usr/bin/docker -H tcp://127.0.0.1:9020
您也可以伪造拨号函数并将其传递给传输:
func fakeDial(proto, addr string) (conn net.Conn, err error) {
return net.Dial("unix", sock)
}
tr := &http.Transport{
Dial: fakeDial,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("http://d/test")
只有一个小警告,您所有的 client.Get
/.Post
调用都必须是有效的 url (http://xxxx.xxx/path
而不是 unix://...
),域名无关紧要,因为它不会用于连接。
关于sockets - go net/http unix域套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26223839/