使用Docker容器部署Golang Web应用程序静态文件
我正在处理一个有一些静态文件(config和html模板)的小型web应用程序:
├── Dockerfile ├── manifest.json ├── session │ ├── config.go │ ├── handlers.go │ └── restapi_client.go ├── templates │ ├── header.tmpl │ └── index.tmpl └── webserver.go
例如,代码中的模板被发现与本地path(这是一个很好的做法? ):
func init() { templates = template.Must(template.ParseGlob("templates/*.tmpl")) }
Docker容器用于应用程序部署。 正如你可以在Dockerfile
看到的,我必须复制/go/bin
目录中的所有静态文件:
FROM golang:latest ENV PORT=8000 ADD . /go/src/webserver/ RUN go install webserver RUN go get webserver # Copy static files RUN cp -r /go/src/webserver/templates /go/bin/templates RUN cp -r /go/src/webserver/manifest.json /go/bin/manifest.json EXPOSE $PORT ENTRYPOINT cd /go/bin && PORT=$PORT REDIRECT=mailtest-1.dev.search.km /go/bin/webserver -manifest=manifest.json
我认为这个解决方法应该被认为是不正确的,因为它违反了标准的Linux约定(单独存储可执行文件和各种数据文件)。 如果有人使用Docker进行Golang Web应用程序部署,请分享您的经验:
- 如何存储静态内容,以及如何在代码中发现静态内容?
- 什么是用Docker容器部署Web应用程序的最合适的方法?
由于您将相对path名传递给template.ParseGlob
,因此它将查找与当前工作目录相关的模板,该目录在您的ENTRYPOINT
中设置为/go/bin
。
我build议修改Dockerfile
来使用WORKDIR
指令将工作目录设置为/go/src/webserver
,这样可以避免将文件复制到/go/bin
,例如:
FROM golang:latest ADD . /go/src/webserver WORKDIR /go/src/webserver RUN go get RUN go install ENV PORT=8000 ENV REDIRECT=mailtest-1.dev.search.km EXPOSE 8000 ENTRYPOINT /go/bin/webserver -manifest=manifest.json
您也可以考虑使用Flynn来部署和pipe理您的应用程序(请参阅此处以了解部署Go Web应用程序的演练)。