2017-09-12 14 views
0

Ich habe versucht, dies in den letzten Stunden herauszufinden, aber ich stecke fest.ERR_EMPTY_RESPONSE von Docker Container

Ich habe eine sehr einfache Dockerfile, die wie folgt aussieht:

FROM alpine:3.6 
COPY gempbotgo/
COPY configs /configs 
CMD ["/gempbotgo"] 
EXPOSE 8025 

gempbotgo nur ein, die einen Webserver und einige andere Sachen läuft gehen binär ist. Der Webserver läuft auf 8025 und sollte mit einer Hallo Welt antworten.

Mein Problem ist mit dem Freilegen von Ports. Ich ließ meine Container wie folgt (nach dem Bau)

docker run --rm -it -p 8025:8025 asd 

Alles scheint in Ordnung, aber wenn ich versuche, 127.0.0.1:8025 im Browser zu öffnen oder eine wget versuchen bekomme ich nur eine leere Antwort. Chrome: ERR_EMPTY_RESPONSE

Der Port wird verwendet und nicht von der Firewall auf meinem Windows 10-System eingeschränkt. Das Ausführen der Go-Binärdatei ohne Container nur auf meinem "Bash auf Ubuntu unter Windows" -Terminal und dann zu 127.0.0.1:8025 Browsing funktioniert ohne Probleme. Andere Adressen haben einen "ERR_CONNECTION_REFUSED" wie 127.0.0.1:8030 zurückgegeben, also ist definitiv etwas am Port aktiv.

Ich ging dann in die conatiner mit

docker exec -it e1cc6daae4cf /bin/sh 

und dort mit einem wget überprüft, was passiert. Auch da keine Probleme. index.html Datei wird mit einem "Hello World" heruntergeladen

Irgendwelche Ideen warum Docker sendet keine Daten? Ich habe auch meinen Container mit Docker-Compose bearbeitet aber keinen Unterschied da.

Ich lief auch den Container auf meinem extern gehosteten VPS. Gleiche Problem gibt es ... (Debian)

Mein Code: (beachten Sie die Makefile) https://github.com/gempir/gempbotgo/tree/docker

Edit:

Nachdem einige Kommentare bekommen änderte ich meine Dockerfile zu einem mehrstufigen bauen. Das ist mein Dockerfile jetzt:

FROM golang:latest 
WORKDIR /go/src/github.com/gempir/gempbotgo 
RUN go get github.com/gempir/go-twitch-irc \ 
    && go get github.com/stretchr/testify/assert \ 
    && go get github.com/labstack/echo \ 
    && go get github.com/op/go-logging 
COPY . . 
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . 

FROM alpine:latest 
RUN apk --no-cache add ca-certificates 
WORKDIR /root/ 
COPY configs ./configs 
COPY --from=0 /go/src/github.com/gempir/gempbotgo/app . 
CMD ["./app"] 
EXPOSE 8025 

Leider dies nichts geändert hat, habe ich alles so nah wie possbile an der Führungs hier gehalten: https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds

Ich habe auch die minimalistische Dockerfile von golang.org versucht, die aussieht wie folgt:

FROM golang:onbuild 
EXPOSE 8025 

Aber auch kein Erfolg damit.

+0

Wie wird die Binärdatei erstellt? Irgendwelche Ausgaben vom Container?Versucht eine andere Basis wie 'ubuntu', um zu verifizieren, dass es kein libc-Problem ist? –

+0

Geben Sie den Code Ihrer Go-Datei ein –

+0

Hier ist mein Code https://github.com/gempir/gempbotgo/tree/docker Beachten Sie das Makefile, das ich anders kompiliere – gempir

Antwort

2

Ihr Problem ist, dass Sie innerhalb Ihres Codes an die 127.0.0.1:8025 gebunden sind. Dadurch funktioniert der Code innerhalb des Containers, aber nicht außerhalb.

Sie müssen an 0.0.0.0:8025 binden, um an alle Schnittstellen innerhalb des Containers zu binden. So wird der von außerhalb des Containers kommende Datenverkehr auch von Ihrer Go-App akzeptiert.