英文:
Deploying Golang web app static files with Docker container
问题
我正在开发一个小型的Web应用程序,其中包含一些静态文件(配置文件和HTML模板):
├── Dockerfile
├── manifest.json
├── session
│ ├── config.go
│ ├── handlers.go
│ └── restapi_client.go
├── templates
│ ├── header.tmpl
│ └── index.tmpl
└── webserver.go
例如,代码中的模板是通过本地路径进行查找的(这是一种好的实践吗?):
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
# 复制静态文件
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应用程序的最合适方法是什么?
英文:
I'm working on a small web application that has some static files (configs and html templates):
├── Dockerfile
├── manifest.json
├── session
│   ├── config.go
│   ├── handlers.go
│   └── restapi_client.go
├── templates
│   ├── header.tmpl
│   └── index.tmpl
└── webserver.go
For instance, templates in the code are discovered with a local path (is it a good practice?):
func init() {
templates = template.Must(template.ParseGlob("templates/*.tmpl"))
}
Docker container is used for app deployment. As you can see in the Dockerfile
, I have to copy all the static files in /go/bin
directory:
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
I think this workaround should be considered as incorrect since it violates standard Linux conventions (separate storing of the executable files and various data files). If anyone uses Docker for Golang web application deployment too, please share your experience:
- How do you store static content and how do you discover it in your code?
- What is the most proper method of deploying web application with a Docker containers?
答案1
得分: 8
由于您将相对路径名传递给template.ParseGlob
,它将在相对于当前工作目录的位置查找模板,而您在ENTRYPOINT
中将当前工作目录设置为/go/bin
。
我建议修改您的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来部署和管理您的应用程序(参见这里有关部署Go Web应用程序的演示)。
英文:
Since you are passing a relative pathname to template.ParseGlob
, it will look for templates relative to the current working directory, which you are setting to /go/bin
in your ENTRYPOINT
.
I would suggest modifying your Dockerfile
to use the WORKDIR
instruction to set the working directory to /go/src/webserver
, which would avoid the need to copy files into /go/bin
, for example:
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
You could also consider using Flynn to deploy and manage your application (see here for a walkthrough of deploying a Go web app).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论