所以我试图自动运行一个简单的#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
答案 0 :(得分:1)
这是一个工作目录问题。在ENTRYPOINT语句之前将以下内容添加到Dockerfile中。
WORKDIR /app
以前,该应用程序试图在容器的根目录中运行,但无法在GateHandler中找到具有相对路径的模板文件。