Docker发布不适用于golang应用程序

时间:2015-07-06 06:05:38

标签: go docker

我正在尝试运行golang web server application(试图通过docker运行由同样的工具驱动的go博客,其功能golang blog)。没有docker它运行正常,但如果我使用docker则无法给出任何响应。我不知道为什么会发生这种情况更简单go web application,同样基于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
  

你好,我想我喜欢冰淇淋!

1 个答案:

答案 0 :(得分:1)

我发现您当前的代码存在两个问题。

首先,localhost中的字符串main.go必须为0.0.0.0。问题是,您已告知您的网络服务器仅提供发送至localhost的请求。由于Docker所做的网络损坏,显示在您的网络服务器上的流量都没有看到网络服务器,就好像它们被发送到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")
)

第二个问题是由于您的导入路径与您正在扩展的onbuild Dockerfile的预定目录结构发生冲突。我看到你试图对导入路径进行硬编码,这不是一个好主意,但我认为这是你唯一的选择,因为go-wrapperonbuild强加给了你。 Dockerfile。最终你应该让docker构建过程在该容器中粘贴一个静态Go二进制文件。这将简化在容器中实际启动服务器的过程。

我没有在你的Go代码中弄乱你的路径,我想你可以解决这个问题,但我确实抓住了上游onbuild Dockerfile并根据你的需要进行了定制。顺便说一句,如果你查看onbuild Dockerfile的documentation,它实际上说使用该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包装惯例。

对不起,这似乎有很多变化,但我希望它至少可以帮助你推进你的项目。如果有什么事情没有意义,请告诉我。