具有Docker的静态Go二进制文件 - 找不到入口点

时间:2016-08-01 19:42:00

标签: go makefile docker dockerfile

我使用Nicola Paolucci的Static Go Binaries with Docker on OSX来尝试使用带有Docker的静态Go二进制文件。我相信我正确地遵循了每一步,但是当我运行最终图像时,我从Docker得到以下错误响应。

注意我的服务和可执行文件的名称为error: expected '(' for function-style cast or type construction

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

出于本文的目的,我们假设我有以下作为我的golang应用程序。

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    

当我运行func main() { router := mux.NewRouter() router.HandleFunc("/ping", api.PingHandler).Methods("GET") http.ListenAndServe(":8282", router) } 时,除了图像运行时,一切似乎都有效。

我可以看到图像在~8.5MB

时正确构建
Make run

但是如果运行eirwin/netverify latest eae16e146b91 3 seconds ago 8.63 MB ,我会收到以下错误...

docker run -p 8282:8282 eirwin/netverify

1 个答案:

答案 0 :(得分:1)

makefile中的go static build缺少一些选项。

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