2015-05-05 35 views
3

我的工作,有一些静态文件(CONFIGS和HTML模板)一个小型Web应用程序的静态文件:部署Golang Web应用程序与码头工人容器

├── 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")) 
} 

泊坞容器用于应用程序部署。正如你可以在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应用程序的最合适的方法?
+0

我会用一个环境变量替换代码中的静态模板路径 - 例如'os.Getenv(“TEMPLATE_PATH”),然后在你的Dockerfile中用'ENV/path/to/template/file'来设置它。如果“TEMPLATE_PATH ==”“',您可以选择回退到同一目录中的硬编码路径。像https://github.com/kelseyhightower/envconfig这样的软件包可以很有用,如果你有多个选项可以通过。 – elithrar

+1

另外,根据约定:二进制文件通常应该*存储在'/ opt /'或'/ opt/usr/local/bin',具体取决于你如何解释文档。 '$ HOME/bin'也是可以接受的。 templates/config文件可以共同位于'/ opt /'或潜在地'/ etc//...' - 记住权限可能是一个问题。 – elithrar

回答

5

既然你传递一个相对路径至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部署和管理您的应用程序(请参阅here了解部署Go Web应用程序的演练)。

+0

我还没有测试过Flynn,但是你的Dockerfile就像一个魅力。谢谢。 –

+0

谢谢!这工作绝对完美! –