去net / http unix域套接字连接

时间:2014-10-06 19:53:54

标签: sockets http go

我无法连接到侦听Unix域套接字的服务器。

Go net/http软件包似乎无法使用套接字路径连接到目标。

是否有一个很好的选择,而无需使用net创建自己的HTTP协议实现?


我找到了许多像these这样的解决方案,但它们不合适

我试过了:

_, err := http.Get("unix:///var/run/docker.sock")(将unix更改为path / socket。它总是抱怨协议不受支持

2 个答案:

答案 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")

playground

只有一个小警告,您的所有client.Get / .Post来电都必须是有效的网址(http://xxxx.xxx/path而不是unix://...),域名无关紧要因为它不会用于连接。

答案 1 :(得分:1)

这个问题被问到并回答了几年,但我在寻找同样的事情时遇到了它。我还发现httpunix包可以熟练地解决这个问题。它还支持注册新协议,因此您可以使用本机URL,例如 http + unix:// service-name / ..... < / strong>即可。为我工作很好。