无法使用Docker容器自动运行简单的Go Web服务器(func(* Template)执行)

时间:2015-03-28 15:12:40

标签: go docker coreos

所以我试图自动运行一个简单的#34; hello world" CoreOS上的docker容器中的Web服务器。但是当应用程序尝试执行HTML模板时,我收到错误。

以下是有问题的代码:

func GateHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Entered the GateHandler.")
    t, _ := template.ParseFiles("templates/helloworld.html")
    fmt.Println("Passed the ParseFiles.")
    err := t.Execute(w, nil)
    fmt.Println("Passed the Execute statement.")
    if err != nil {
        fmt.Println(err)
    }
}

这是我的Dockerfile:

FROM ubuntu:14.04
RUN mkdir app
ADD assets /app/assets 
ADD templates /app/templates
ADD web /app/web
ENV PORT 80
EXPOSE 80
ENTRYPOINT ["/app/web"]

当我运行docker容器并导航到浏览器中的相应URL时,我看到以下错误:

Entered the GateHandler.
Passed the ParseFiles.
2015/03/28 00:10:53 http: panic serving 10.0.2.2:56292: runtime error: invalid memory address or nil pointer dereference
goroutine 5 [running]:
net/http.func·011()
    /usr/local/go/src/net/http/server.go:1130 +0xbb
html/template.(*Template).escape(0x0, 0x0, 0x0)
    /usr/local/go/src/html/template/template.go:56 +0x3a
html/template.(*Template).Execute(0x0, 0x7f1593124360, 0xc20804c460, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/html/template/template.go:75 +0x3d
main.GateHandler(0x7f1593124290, 0xc20804c460, 0xc20803c1a0)

......等等。

但是,当我从Dockerfile中删除入口点时,使用/ bin / bash运行容器并手动启动应用程序" ./ app / web",Web应用程序运行完美。看起来像t.Execute()没有像它应该传递错误。唯一的区别是我从docker run启动web应用程序,而不是在容器中手动启动它。

任何见解?启动容器会更方便,而不必担心手动启动Web服务器。

感谢。

更新

作为Go的新手,我忽略了永远不会忽略返回错误的基本原则。修复代码提供了更多有用的信息。

Entered the GateHandler.
open templates/helloworld.html: no such file or directory
Passed the ParseFiles.
... and so on

所以这意味着当我使用Docker容器自动运行Web应用程序时,它无法找到模板文件。仍在努力找出原因。

golang-nuts post:https://groups.google.com/forum/#!topic/golang-nuts/j6JTFpGg6fI

1 个答案:

答案 0 :(得分:1)

这是一个工作目录问题。在ENTRYPOINT语句之前将以下内容添加到Dockerfile中。

WORKDIR /app

以前,该应用程序试图在容器的根目录中运行,但无法在GateHandler中找到具有相对路径的模板文件。

https://docs.docker.com/reference/builder/#workdir