標籤:

本地構建go-ipfs容器

本地構建go-ipfs容器

來自專欄 區塊鏈與雲計算

建立IPFS多節點集群,使用Kubernetes最為方便了。可以參考:

ipfs/kubernetes-ipfs?

github.com圖標

如果修改了一些IPFS代碼,需要在本地構建容器鏡像,那麼就得使用Dockerfile了:

ipfs/go-ipfs?

github.com圖標

不過這裡有兩個網路相關的問題需要解決,否則在國內是無法順利構建的。

第一個問題,go-ipfs使用gx來做包管理,gx將包都存儲在IPFS網路上,那麼如果不能訪問ipfs.io,那麼gx下載將都失敗。gx默認不使用HTTP_PROXY/HTTPS_PROXY等環境變數作為http代理。我們找到解決這個限制的辦法,就是修改gx依賴的的go-ipfs-api中的shell.go:

ipfs/go-ipfs-api?

github.com圖標

func NewShell(url string) *Shell { c := &gohttp.Client{ Transport: &gohttp.Transport{ Proxy: gohttp.ProxyFromEnvironment, // 這裡是添加的一行 DisableKeepAlives: true, }, } return NewShellWithClient(url, c)}

然後編譯安裝gx:

go install github.com/whyrusleeping/gxgo install github.com/whyrusleeping/gx-go

接著,編譯go-ipfs:

[root@vman ~]# cd $GOPATH/src/github.com/ipfs/go-ipfs[root@vman go-ipfs]# make build

這樣也生成了gx可執行文件:

[root@vman go-ipfs]# ll bin/gx*lrwxrwxrwx 1 root root 10 Mar 20 12:23 bin/gx -> gx-v0.12.1lrwxrwxrwx 1 root root 12 Mar 20 12:23 bin/gx-go -> gx-go-v1.6.0-rwxr-xr-x 1 root root 12043862 Mar 20 12:23 bin/gx-go-v1.6.0-rwxr-xr-x 1 root root 11375820 Mar 20 12:23 bin/gx-v0.12.1

這個gx會影響後續容器構建,所以需要替換為我們剛剛編譯的gx:

[root@vman go-ipfs]# cp $GOPATH/bin/gx bin/gx-v0.12.1[root@vman go-ipfs]# cp $GOPATH/bin/gx-go bin/gx-go-v1.6.0

第二個問題,使用上面修改過的gx來給構建容器時下載依賴的包,要設置代理。比如是本機上的代理,那麼應該執行:

[root@vman go-ipfs]# docker build -t test/go-ipfs --build-arg HTTP_PROXY=http://localhost:1080 --build-arg HTTPS_PROXY=http://localhost:1080 --network=host .

其中使用host網路模式,是為了使構建容器能夠訪問到本機代理。

好了,解決了上述兩個問題,就可以構建成功啦:

Sending build context to Docker daemon 36.13MBStep 1/30 : FROM golang:1.9-stretch ---> a6c306bd0b2fStep 2/30 : MAINTAINER Lars Gierth <lgierth@ipfs.io> ---> Using cache ---> 25fe38ea4635Step 3/30 : ENV GX_IPFS "" ---> Using cache ---> bf080a8aa91aStep 4/30 : ENV SRC_DIR /go/src/github.com/ipfs/go-ipfs ---> Using cache ---> 410396468560Step 5/30 : COPY . $SRC_DIR ---> Using cache ---> 1e3edd56aca0Step 6/30 : RUN cd $SRC_DIR && mkdir .git/objects && ([ -z "$GX_IPFS" ] || echo $GX_IPFS > /root/.ipfs/api) && make build ---> Running in f8f9809c1576bin/check_go_version 1.9bin/check_go_path /go/src/github.com/ipfs/go-ipfs /go/src/github.com/ipfs/go-ipfsrm -f bin/gxln -s gx-v0.12.1 bin/gxrm -f bin/gx-goln -s gx-go-v1.6.0 bin/gx-gogx install --global[done] [fetch] goprocess QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP 2.418s[done] [fetch] pubsub QmdbxjQWogRCHRaxhhGnYdT1oQJzL9GdqSKzCdqWr85AP2 2.125s......Step 30/30 : CMD ["daemon", "--migrate=true"] ---> Running in 884f1f3a71d9Removing intermediate container 884f1f3a71d9 ---> daf8f1625be8Successfully built daf8f1625be8Successfully tagged test/go-ipfs:latest

推薦閱讀:

IPFS:Filecoin和複製證明
IPFS--潛力與風險並存的超級項目
filecoin在ipfs系統中作用是什麼?
一場IPFS引領下的共享之風正在走向區塊鏈
什麼是IPFS?(二)

TAG:IPFS | Docker |