2016-08-01 26 views
0

我使用Nicola Paolucci的Static Go Binaries with Docker on OSX嘗試使用具有Docker的靜態Go二進制文件。我相信我正確地遵循了每一步,但是當我運行最終的圖像時,我得到了來自Docker的以下錯誤響應。具有Docker的靜態轉向二進制文件 - 未找到入口點

我的服務和可執行文件的名稱是netverify

docker: Error response from daemon: Container command '/netverify' not found or does not exist.. 

Dockerfile.static看起來如下...

#Create a minimal container to run a Golang static binary 

FROM tianon/true 
ADD netverify/
EXPOSE 8282 
CMD ["/netverify"] 

Dockerfile.build看起來如下...

FROM golang 

ADD Makefile/
WORKDIR/
RUN make setup 

ADD . /go/src/github.com/eirwin/netverify 

RUN make buildgo 
CMD ["/bin/bash"] 

Makefile是以下...

GOCMD = go 
GOBUILD = $(GOCMD) build 
GOGET = $(GOCMD) get -v 
GOCLEAN = $(GOCMD) clean 
GOINSTALL = $(GOCMD) install 
GOTEST = $(GOCMD) test 

.PHONY: all 

all: build 

setup: 
    $(GOGET) github.com/gorilla/mux 

buildgo: 
    GOOS=linux $(GOBUILD) -o netverify ./go/src/github.com/eirwin/netverify 

builddocker: 
    docker build -t eirwin/netverify -f ./Dockerfile.build . 
    docker run -t eirwin/netverify /bin/true 
    docker cp `docker ps -q -n=1`:/netverify . 
    chmod 755 ./netverify 
    docker build --rm=true --tag=eirwin/netverify -f Dockerfile.static . 

run: builddocker 
    docker run -p 8282:8282 eirwin/netverify  

對於這篇文章的目的,讓我們假設我有以下爲我golang應用。

func main() { 

    router := mux.NewRouter() 
    router.HandleFunc("/ping", api.PingHandler).Methods("GET") 
    http.ListenAndServe(":8282", router) 
} 

當我運行Make run一切似乎除了當圖像被跑了工作。

我可以看到圖像在〜8.5MB

eirwin/netverify latest eae16e146b91 3 seconds ago  8.63 MB 

建立正確但當如果docker run -p 8282:8282 eirwin/netverify是跑了,我得到以下錯誤...

docker: Error response from daemon: Container command '/netverify' not found or does not exist.. 
+0

什麼「以下文章」?我在這裏看不到有關構建靜態二進制文件的任何內容,或者有什麼靜態二進制文件與docker錯誤有關。 – JimB

+0

@JimB我更新了帖子。我很抱歉。 – TheJediCowboy

+2

您不是按照指示構建靜態二進制文件。我不確定這是唯一的問題,但你需要從那裏開始。另外'天真/真實'圖像看起來並不特別有用。你可以自己從頭開始,或者使用像「阿爾派」這樣更完整的東西 – JimB

回答

1

中去靜電積聚您makefile缺少一些選項。

buildgo: 
    CGO_ENABLED=0 GOOS=linux go build -ldflags "-s" -a -installsuffix cgo -o netverify ./go/src/github.com/eirwin/netverify 

構建過程可以捕獲容器ID以避免計時問題。
分隔構建和二進制圖像的標籤。

builddocker: 
    docker build -t eirwin/netverify-build -f ./Dockerfile.build . 
    CID=$$(docker create eirwin/netverify-build); \ 
    docker cp $$CID:/netverify .; \ 
    docker rm $$CID 
    chmod 755 ./netverify 
    docker build --rm=true --tag=eirwin/netverify -f Dockerfile.static . 

您的二進制文件Dockerfile.static可以與scratch空白圖像開始。

FROM scratch