Deployment 使用Docker容器部署Golang web app静态文件

Deployment 使用Docker容器部署Golang web app静态文件,deployment,go,docker,static-files,Deployment,Go,Docker,Static Files,我正在开发一个具有一些静态文件(配置和html模板)的小型web应用程序: 例如,代码中的模板是通过本地路径发现的(这是一种好做法吗?) Docker容器用于应用程序部署。正如您在Dockerfile中看到的,我必须复制/go/bin目录中的所有静态文件: FROM golang:latest ENV PORT=8000 ADD . /go/src/webserver/ RUN go install webserver RUN go get webserver # Copy static

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

例如,代码中的模板是通过本地路径发现的(这是一种好做法吗?)

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

我建议修改
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

您还可以考虑使用部署和管理您的应用程序(请参阅部署GoWeb应用程序的演练)。

我将用一个环境变量替换代码中的静态模板路径——例如“代码> OS”Getenv(“TeMeTeMePATH”)<代码>,然后在DoCKFrfile中用<代码> Env/Poto/to/Studio/file >代码设置它。如果
模板路径==”
,您可以选择退回到同一目录中的硬编码路径。如果您有多个选项可以传入,那么像这样的包可能很有用。此外,根据惯例:二进制文件通常应存储在
/opt/
/usr/local/bin
中,具体取决于您对文档的解释方式<代码>$HOME/bin
也可接受。模板/配置文件可以放在
/opt/
或潜在的
/etc/…
中-请记住权限可能是一个问题。我还没有测试Flynn,但您的Dockerfile工作得很好。非常感谢。
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
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