我正在尝试通过docker运行golang Web服务器应用程序(该应用程序试图运行由支持golang blog的相同工具提供支持的go blog)。它在没有docker的情况下运行良好,但是如果我使用docker,则无法给出任何响应。我不知道为什么会发生这种情况,因为对于一个更简单的go Web应用程序,基于docker的相同方法效果很好。有关我使用的各种命令的输出,请参见下文。任何帮助将不胜感激。
docker pull maddyonline/gotutorial
docker run -d --publish 8080:8080 --name gotut maddyonline/gotutorial
81bc36e385286326a6d9f74322515a7b9748e493275c3426bcc6848a4589a7e7
docker ps
容器ID图像命令
创建的状态端口名称81bc36e38528 maddyonline / gotutorial“ go-wrapper run” 20秒前向上20秒0.0.0.0:8080->8080/tcp gotut
curl localhost:8080
curl:(52)来自服务器的空回复
docker exec gotut curl localhost:8080
<!DOCTYPE html> <html> <head>
和其余文件
我正在使用的docker文件非常简单。
FROM golang:onbuild
EXPOSE 8080
我在同一台服务器上使用更简单的golang应用程序对同一docker文件进行了实验。而且有效。
docker pull maddyonline/gowebapp
docker run -d --publish 8080:8080 --name gowebapp maddyonline/gowebapp
curl localhost:8080/icecream
嗨,我想我喜欢冰淇淋!
我发现您当前的代码有两个问题。
首先是localhost
您main.go
需要的字符串是0.0.0.0
。问题是您已告知Web服务器仅处理发送给的请求localhost
。由于Docker会造成网络混乱,因此显示在您Web服务器上的所有流量都不会像发送到那样看向Web服务器localhost
。通过告诉您的Web服务器进行侦听,0.0.0.0
您可以有效地告诉它,它不在乎流量最初发送到的位置,它会接受所有流量。
var (
httpFlag = flag.String("http", "0.0.0.0:8080", "HTTP listen address") // <--- Here it the change. It's roughly line 25 of [main.go](https://github.com/maddyonline/gotutorial/blob/master/main.go#L25)
originFlag = flag.String("origin", "", "web socket origin for Go Playground (e.g. localhost)")
baseFlag = flag.String("base", "", "base path for articles and resources")
)
第二个问题是由于您的导入路径与您onbuild
要从其扩展的Dockerfile 的预定目录结构相冲突。我看到您正在尝试对导入路径进行硬编码,这不是一个好主意,但是我认为这是您唯一的选择,因为Dockerfile go-wrapper
强迫将其强加给您onbuild
。最终,您只需要让docker构建过程在该容器中粘贴一个静态Go二进制文件即可。这将简化在容器中实际启动服务器的过程。
我并没有弄乱Go代码中的路径,我想您可以解决这个问题,但是我确实抓住了上游onbuild
Dockerfile并根据需要对其进行了自定义。顺便说一句,如果您查看Dockerfile 的文档,onbuild
它实际上说使用该Dockerfile是一个坏主意。;)因此,我接受了他们的建议,这是我的港口:
FROM golang:1.4.2
RUN mkdir -p /go/src/github.com/maddyonline/gotutorial
WORKDIR /go/src/github.com/maddyonline/gotutorial
ADD . /go/src/github.com/maddyonline/gotutorial
RUN go-wrapper download
RUN go-wrapper install
EXPOSE 8080
CMD ["go-wrapper", "run"]
您的其他示例服务器应用程序没有相同的问题,因为导入路径的指定方式与项目中的指定方式不同。基本上,它不在乎它在哪里,因为它的依赖项没有被硬编码到文件路径中。它使用常规的Go打包约定。
抱歉,可能看起来有很多更改,但我希望它至少可以帮助您推进项目。让我知道是否没有任何意义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句