gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:59 25 4
gpt4 key购买 nike

所以我试图在 CoreOS 上的 docker 容器中自动运行一个简单的“hello world”网络服务器。但是当应用程序尝试执行 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”时,网络应用程序运行完美。看起来 t.Execute() 没有像它应该的那样传递错误。唯一的区别是我从 docker run 启动网络应用程序,而不是在容器内手动启动它。

有什么见解吗?启动容器会方便很多,而不必担心手动启动 Web 服务器。

谢谢。

更新:

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

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

所以这意味着当我使用 Docker 容器自动运行 Web 应用程序时,它找不到模板文件。仍在努力弄清楚这是为什么。

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

最佳答案

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

WORKDIR /app

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

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

关于go - 无法使用 Docker 容器自动运行简单的 Go Web 服务器(func (*Template) Execute),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29318742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com