2014-10-06 147 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://服務名稱/ .....。爲我工作得非常好。