我有一些使用 Docker 部署 Go 应用程序的经验。
TL;DR
这就是我的项目在${GOPATH}/src/github.com/githubhandle/project中的样子
main.go
vendor.conf
vendor/
github.com/gorilla/mux
github.com/sirupsen/logrus
github.com/bshuster-repo/logrus-logstash-hook
...
Dockerfile
Dockerfile 看起来像这样:
FROM golang:1.8
WORKDIR /go/src/app
COPY . .
RUN go-wrapper download
RUN go-wrapper install
EXPOSE [8080]
ENTRYPOINT ["go-wrapper", "run", "main.go"]
差不多
长答案
一般来说,我喜欢将我的 Dockerfile 放在服务器目录中:
go/
src/
github.com/
mygithub/
serverproject/
main.go
Dockerfile
如果我在我的项目中使用非标准包,例如 (gorilla/mux),我可能会使用 vndr 创建一个供应商目录,在其中放置所有这些包并管理它们的版本。
之后我的 Dockerfile 可能会是这样的:
FROM golang:1.8
WORKDIR /go/src/app
COPY . .
RUN go-wrapper download
RUN go-wrapper install
ENTRYPOINT ["go-wrapper", "run", "main.go"]
注意您可能希望自动公开端口号。例如,添加此行会将容器内的 8080 端口暴露给主机。
PORT 8080
剩下要做的就是从go/src/github.com/mygithub/serverproject内部构建镜像:
docker build -t serverproject .
并将其部署到容器中:
docker run -P --rm --name myserver1 serverproject
如果你想将参数传递给服务器,你可以这样做:
docker run -P --rm --name myserver1 serverproject --arg1 --arg2=bla
注意如果您没有在 Dockerfile 中指定 PORT 并希望将其公开给主机,请在 --name 之前将 -P 替换为 -p 并指定 @987654337 @:
docker run --rm -p 8080:8080 ...
这实际上会从您的主机端口转发到容器。