2016-08-01 11 views
0

Ich habe Static Go Binaries with Docker on OSX von Nicola Paolucci verwendet, um statische Go binary w/Docker zu verwenden. Ich glaube, dass ich jeden Schritt korrekt befolgte, aber wenn ich das endgültige Bild ausführe, erhalte ich die folgende Fehlermeldung von Docker.Statische Go-Binärdateien mit Docker - Einstiegspunkt nicht gefunden

HINWEIS Der Name meines Dienstes und ausführbar sind netverify

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

Meine Dockerfile.static wie folgt aussieht ...

#Create a minimal container to run a Golang static binary 

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

Meine Dockerfile.build wie folgt aussieht ...

FROM golang 

ADD Makefile/
WORKDIR/
RUN make setup 

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

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

Mein Makefile ist die folgende ...

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  

Für den Zweck dieser Stelle sei angenommen, lässt ich habe folgendes als meine golang Anwendung.

func main() { 

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

Wenn ich laufe Make run alles außer, wenn das Bild läuft ist zu funktionieren scheint.

kann ich sehen, dass das Bild richtig bei ~ baut 8.5MB

eirwin/netverify latest eae16e146b91 3 seconds ago  8.63 MB 

Aber wenn Wenn docker run -p 8282:8282 eirwin/netverify lief wird ich die folgende Fehlermeldung erhalten ...

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

Was "folgenden Artikel"? Ich sehe hier nichts über das Erstellen einer statischen Binärdatei, oder was eine statische Binärdatei haben würde, würde mit dem Docker-Fehler zu tun haben. – JimB

+0

@ JimB Ich habe den Beitrag aktualisiert. Entschuldigen Sie. – TheJediCowboy

+2

Sie erstellen keine statische Binärdatei für die Richtungen. Ich bin mir nicht sicher, ob das das einzige Problem ist, aber Sie müssen dort anfangen. Auch das 'tianon/true' Bild sieht nicht besonders nützlich aus. Sie können selbst mit "scratchen" beginnen oder etwas vollständigeres wie "alpine" verwenden – JimB

Antwort

1

Die gehen statische Aufladung in Ihrem Makefile fehlt einige Optionen.

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

Der Erstellungsprozess kann die Container-ID erfassen, um Zeitprobleme zu vermeiden.
Trennen Sie die Tags für Build- und Binärbilder.

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 . 

Ihre binäre Dockerfile.static kann mit dem scratch leeren Bild beginnen.

FROM scratch