使用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应用程序的演练)。