我一直在尝试在最近几个小时内解决这个问题,但是我陷入了困境。
我有一个非常简单的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 . …Run Code Online (Sandbox Code Playgroud)