静态转到二进制文件与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