gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:26:39 25 4
gpt4 key购买 nike

我正在开发一个包含一些静态文件(配置和 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 应用程序的最合适方法是什么?

最佳答案

由于您将相对路径名传递给 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

您也可以考虑使用 Flynn部署和管理您的应用程序(有关部署 Go 网络应用程序的演练,请参阅 here)。

关于deployment - 使用 Docker 容器部署 Golang Web 应用程序静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30059122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com