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:
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With