来自Docker容器的ERR_EMPTY_RESPONSE

gem*_*pir 1 windows bash docker docker-compose

我一直在尝试在最近几个小时内解决这个问题,但是我陷入了困境。

我有一个非常简单的Dockerfile,看起来像这样:

FROM alpine:3.6
COPY gempbotgo /
COPY configs /configs
CMD ["/gempbotgo"]
EXPOSE 8025
Run Code Online (Sandbox Code Playgroud)

gempbotgo只是运行网络服务器和其他一些东西的go二进制文件。该网络服务器在8025上运行,并且应该向世界问好。

我的问题是暴露端口。我这样运行容器(构建后)

docker run --rm -it -p 8025:8025 asd
Run Code Online (Sandbox Code Playgroud)

一切似乎都很好,但是当我尝试在浏览器中打开127.0.0.1:8025或尝试wget时,我只是得到一个空响应。Chrome:ERR_EMPTY_RESPONSE

Windows 10系统上的防火墙使用了该端口,但不受该端口的限制。仅在我的“ Windows上的Ubuntu上的Bash”终端上运行不带容器的go二进制文件,然后浏览至127.0.0.1:8025即可顺利进行。其他地址返回了“ ERR_CONNECTION_REFUSED”,例如127.0.0.1:8030,因此该端口上肯定有活动的东西。

然后,我带着

docker exec -it e1cc6daae4cf /bin/sh
Run Code Online (Sandbox Code Playgroud)

并在那里用wget进行检查。也没有问题。使用“ Hello World”下载index.html文件

有什么想法为什么码头工人不发送任何数据?我也用docker-compose运行了我的容器,但没有任何区别。

我还在外部托管的VPS上运行了容器。那里同样的问题...(Debian)

我的代码:(注意Makefile) https://github.com/gempir/gempbotgo/tree/docker

编辑:

在收到一些评论后,我将Dockerfile更改为多阶段构建。现在是我的Dockerfile:

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
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这并没有改变任何东西,我将所有内容都尽可能地保持在此处的指南的位置:https : //docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds

我还尝试了golang.org提供的简约Dockerfile,如下所示:

FROM golang:onbuild
EXPOSE 8025
Run Code Online (Sandbox Code Playgroud)

但那也没有成功。

Tar*_*ani 14

您的问题是您要绑定到127.0.0.1:8025内部代码。这使代码从容器内部而不是外部工作。

您需要绑定到0.0.0.0:8025以绑定到容器内的所有接口。因此,Go应用程序也接受来自容器外部的流量

  • 非常感谢。这正是我的解决方案 (6认同)
  • 我正在使用 Flask,经过几个小时的调试哈哈,遇到了同样的问题,正如你建议的那样,我使用了 ```app.run(host='0.0.0.0)``` (4认同)
  • 哇,谢谢,拔掉我的头发后,这也是我的问题的解决方案 (3认同)

小智 5

添加到已接受的答案:我在尝试运行 docker/getting-started 时遇到了相同的错误消息。

问题是“入门”正在使用端口 80,而这netsh http show urlacl在我的机器上被“占用”()。

我不得不使用docker run -d -p 8888:80 docker/getting-started8888 是一个未使用的端口。然后打开“http://localhost:8888/tutorial/”。