我正在尝试通过 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
Run Code Online (Sandbox Code Playgroud)
81bc36e385286326a6d9f74322515a7b9748e493275c3426bcc6848a4589a7e7
docker ps
Run Code Online (Sandbox Code Playgroud)
容器 ID 图像命令
已创建状态端口名称 81bc36e38528 maddyonline/gotutorial "go-wrapper run" 20 秒前 20 秒前 0.0.0.0:8080->8080/tcp gotut
curl localhost:8080
Run Code Online (Sandbox Code Playgroud)
卷曲:(52)服务器的空回复
docker exec gotut curl localhost:8080
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)<!DOCTYPE html> <html> <head>以及文件的其余部分
我使用的 docker 文件非常简单。
FROM golang:onbuild
EXPOSE 8080
Run Code Online (Sandbox Code Playgroud)
我在同一台服务器上用一个更简单的 golang 应用程序尝试了相同的 docker 文件。它有效。
docker pull maddyonline/gowebapp
docker run -d --publish 8080:8080 --name gowebapp maddyonline/gowebapp
curl localhost:8080/icecream
Run Code Online (Sandbox Code Playgroud)
你好,我想我喜欢冰淇淋!
我发现您当前的代码有两个问题。
首先是localhost您main.go需要的字符串是0.0.0.0. 问题是您已经告诉您的网络服务器仅处理发送到 的请求localhost。由于 Docker 会进行网络破坏,因此显示在您的 Web 服务器上的流量不会在 Web 服务器上看起来像发送到localhost. 通过告诉你的网络服务器监听,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")
)
Run Code Online (Sandbox Code Playgroud)
第二个问题是由于您的导入路径与onbuild您从中扩展的 Dockerfile 的预定目录结构发生冲突。我看到你试图对导入路径进行硬编码,这不是一个好主意,但我认为这是你唯一的选择,因为go-wrapperDockerfile 强加给你的路径很奇怪onbuild。最终,您应该让 docker 构建过程在该容器中粘贴静态 Go 二进制文件。这将简化在容器中实际启动服务器的过程。
我没有弄乱你的 Go 代码中的路径,我想你可以解决这个问题,但我确实获取了上游onbuildDockerfile 并根据你的需要对其进行了自定义。顺便说一句,如果您查看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"]
Run Code Online (Sandbox Code Playgroud)
您的其他示例服务器应用程序没有遇到相同的问题,因为导入路径的指定方式与此项目中的方式不同。基本上,它并不关心它所在的位置,因为它的依赖项没有被硬编码到文件路径。它使用正常的 Go 打包约定。
抱歉,这可能看起来有很多变化,但我希望它至少可以帮助您推进项目。如果有任何不明白的地方请告诉我。