【问题标题】:Deploying Golang web app static files with Docker container使用 Docker 容器部署 Golang Web 应用静态文件
【发布时间】:2015-07-15 13:12:10
【问题描述】:

我正在开发一个包含一些静态文件(配置和 html 模板)的小型 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"))
}

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 应用程序最合适的方法是什么?

【问题讨论】:

  • 我会用环境变量替换代码中的静态模板路径 - 例如os.Getenv("TEMPLATE_PATH") 然后在您的 Dockerfile 中使用 ENV /path/to/template/file 进行设置。如果TEMPLATE_PATH == "",您可以选择回退到同一目录中的硬编码路径。如果您有多个选项可以传入,像 github.com/kelseyhightower/envconfig 这样的包会很有用。
  • 此外,就约定而言:二进制文件通常应存储在/opt//usr/local/bin 中,具体取决于您如何解释文档。 $HOME/bin 也是可以接受的。模板/配置文件可以位于/opt//etc/<yourapp>/... - 请记住权限可能是个问题。

标签: deployment go docker static-files


【解决方案1】:

由于您将相对路径名传递给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 应用程序的演练)。

【讨论】:

  • 我还没有测试过 Flynn,但你的 Dockerfile 就像一个魅力。谢谢。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 2022-11-12
相关资源
最近更新 更多