2014-10-06 118 views
4

我无法连接到我的服务器,该服务器在Unix域套接字上侦听。Go net/http unix域套接字连接

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

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


我发现很多的解决方案一样these,但它们不适合

我曾尝试:

_, err := http.Get("unix:///var/run/docker.sock")(改变unixpath/socket它总是抱怨不受支持的协议

回答

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://...),域名并不重要,因为它不会用于连接。

+0

谢谢,这让我走上了正轨 – 2014-10-06 20:10:05

+0

@matejkramny我添加了一个关于使用http的提示。 – OneOfOne 2014-10-06 20:11:52

+0

@matejkramny检查更新的答案。 – OneOfOne 2014-10-06 20:24:34

1

这个问题已经过了几年了,但我在找到同样的东西时遇到了这个问题。我还发现httpunix包专门解决这个问题。它还支持注册一个新的协议,所以你可以使用本地URL,如http + unix://服务名称/ .....。为我工作得非常好。