静态转到二进制文件与Docker – 找不到入口点

在OSX上 ,我使用了Static Go Binaries和 Nicola Paolucci的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似乎工作,除了图像运行时。

我可以看到图像正确地build立在〜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.. 

在生成文件中去静态构build是缺less一些选项。

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

构build过程可以捕获容器ID以避免计时问题。
分开构build和二进制图像的标签。

 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