我无法连接到侦听Unix域套接字的服务器。
Go net/http
软件包似乎无法使用套接字路径连接到目标。
是否有一个很好的选择,而无需使用net
创建自己的HTTP协议实现?
我找到了许多像these这样的解决方案,但它们不合适
我试过了:
_, err := http.Get("unix:///var/run/docker.sock")
(将unix
更改为path
/ socket
。它总是抱怨协议不受支持
答案 0 :(得分:19)
你必须实现自己的RoundTripper来支持 unix
套接字。
最简单的方法可能是使用http而不是unix套接字与docker进行通信。
编辑init脚本并添加-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
来电都必须是有效的网址(http://xxxx.xxx/path
而不是unix://...
),域名无关紧要因为它不会用于连接。
答案 1 :(得分:1)
这个问题被问到并回答了几年,但我在寻找同样的事情时遇到了它。我还发现httpunix包可以熟练地解决这个问题。它还支持注册新协议,因此您可以使用本机URL,例如 http + unix:// service-name / ..... < / strong>即可。为我工作很好。