使用Docker容器部署Golang Web应用程序静态文件

Vit*_*aev 5 deployment static-files go docker

我正在开发一个包含一些静态文件(配置和html模板)的小型Web应用程序:

??? Dockerfile
??? manifest.json
??? session
?   ??? config.go
?   ??? handlers.go
?   ??? restapi_client.go
??? templates
?   ??? header.tmpl
?   ??? index.tmpl
??? webserver.go
Run Code Online (Sandbox Code Playgroud)

例如,代码中的模板是使用本地路径发现的(这是一个好习惯吗?):

func init() {
    templates = template.Must(template.ParseGlob("templates/*.tmpl"))
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我认为这种解决方法应该被认为是不正确的,因为它违反了标准的Linux约定(单独存储可执行文件和各种数据文件).如果有人也使用Docker进行Golang Web应用程序部署,请分享您的经验:

  • 如何存储静态内容以及如何在代码中发现它?
  • 使用Docker容器部署Web应用程序的最合适方法是什么?

lma*_*ars 6

既然你传递一个相对的路径名template.ParseGlob,它会寻找相对于当前工作目录模板,你设置/go/bin你的ENTRYPOINT.

我建议修改你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
Run Code Online (Sandbox Code Playgroud)

您还可以考虑使用Flynn来部署和管理您的应用程序(请参阅此处了解部署Go Web应用程序的演练).