2016-08-01 10 views
0

Nicola PaolucciがStatic Go Binaries with Docker on OSXを使って静的Goバイナリw/Dockerを使用しようとしました。私はすべてのステップを正しく実行したと信じていますが、最終イメージを実行すると、Dockerから次のエラー応答が返されます。Docker付きスタティックゴーバイナリ - Entrypointが見つかりません

NOTE私のサービスや実行ファイルの名前が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.5メガバイトの画像が正しく構築していることがわかります

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

"次の記事"とは何ですか?私は静的なバイナリを構築することについて何も表示されません、または静的なバイナリを持つことは、ドッカーのエラーと関係があります。 – JimB

+0

@JimB投稿を更新しました。謝罪いたします。 – TheJediCowboy

+2

あなたは方向ごとにスタティックバイナリを構築していません。それが唯一の問題なのかどうかは分かりませんが、そこから始める必要があります。また、 'tianon/true'画像は特に有用に見えません。 'scratch'で自分自身を始めることもできますし、' alpine'のようにもっと完全なものを使うこともできます – 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.staticscratch白紙画像で始めることができます。

FROM scratch 
関連する問題