我無法連接到我的服務器,該服務器在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