我无法连接到我的服务器,该服务器在Unix域套接字上侦听。Go net/http unix域套接字连接
Go的net/http
软件包似乎无法使用套接字路径连接到目标。
是否有一个很好的选择,而不必使用net
创建自己的HTTP协议实现?
我发现很多的解决方案一样these,但它们不适合
我曾尝试:
_, err := http.Get("unix:///var/run/docker.sock")
(改变unix
到path
/socket
它总是抱怨不受支持的协议
我无法连接到我的服务器,该服务器在Unix域套接字上侦听。Go net/http unix域套接字连接
Go的net/http
软件包似乎无法使用套接字路径连接到目标。
是否有一个很好的选择,而不必使用net
创建自己的HTTP协议实现?
我发现很多的解决方案一样these,但它们不适合
我曾尝试:
_, err := http.Get("unix:///var/run/docker.sock")
(改变unix
到path
/socket
它总是抱怨不受支持的协议
您将不得不实施自己的
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://...
),域名并不重要,因为它不会用于连接。
这个问题已经过了几年了,但我在找到同样的东西时遇到了这个问题。我还发现httpunix包专门解决这个问题。它还支持注册一个新的协议,所以你可以使用本地URL,如http + unix://服务名称/ .....。为我工作得非常好。
谢谢,这让我走上了正轨 – 2014-10-06 20:10:05
@matejkramny我添加了一个关于使用http的提示。 – OneOfOne 2014-10-06 20:11:52
@matejkramny检查更新的答案。 – OneOfOne 2014-10-06 20:24:34