开发Golang应用程序以在Docker容器中运行的最佳实践/方法

基本上标题说什么…是否有一个最佳实践或有效的方法来开发一个将被Docker化的Golang应用程序? 我知道你可以装载卷来指向你的源代码,对于PHP等语言来说,它不需要编译你的代码。 但是对于Go来说,与Docker一起开发似乎是一件痛苦的事情,因为我猜你几乎只有两种select。

首先会有一个Dockerfile,它只是onbuild,所以当一个容器运行时,它启动的应用程序,因此不得不build立一个新的形象,每一个变化(无论是否小)。 或者,你可以将你的源代码目录安装到容器目录中,然后附加到容器本身,并像通常一样执行手动生成/运行。

这两种方式实际上是我看到它发生的唯一方式,除非您不在Docker容器中开发您的Go应用程序。 只要正常开发它,然后使用临时图像的方法,你预先生成一个二进制文件,然后将其复制到您的容器,当你准备好运行它。 我认为这可能是要走的路,但我想问更多的专业人士,也许会得到一些关于这个话题的反馈。

不知道这是最好的实践,但这是我的方式。

  1. Makefile是强制性的
  2. 使用我的本地机器和我的工具进行小的迭代
  3. 使用基于golang的专用构build容器:{1.X,latest},安装代码目录来构build一个发行版,主要是为了确保我的代码能够在CI上正确构build。 (提示,这里是我的标准去构build发布命令的命令: CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
  4. testing代码
  5. 然后使用FROM scratch构build一个发布容器(复制bin +入口点)
  6. 将您的图像推送到您的registry

步骤3到6是CI的任务。

重要说明:由于新的多级构buildfunction,这一点正在发生变化: https : //docs.docker.com/engine/userguide/eng-image/multistage-build/ ,没有更多的构buildVS释放容器。

构build容器和释放容器将被合并在一个多级构build中,所以一个Dockerfile(不知道正确的语法,但你会得到这个想法):

 FROM golang:latest as build WORKDIR /go/src/myrepos/myproject RUN go build -o mybin FROM scratch COPY --from=build /go/src/myrepos/myproject/mybin /usr/local/bin/mybin ENTRYPOINT [ "/usr/local/bin/mybin" ] 

据我了解你的问题,你想有一个运行容器来开发一个golang应用程序。 同样的事情也可以在你的主机上完成。 但是,好的一点是,如果你能build立这样的应用程序,那么将被视为云平台即服务(PaaS)。

容器的基本要求是:Ubuntu映像和其他软件包,比如编辑器,golang编译器等等。

我会build议看看docker开发环境。 https://docs.docker.com/opensource/project/set-up-dev-env/

docker开发环境在一个容器中运行,这些文件从一个主机目录挂载。 容器映像是从Ubuntu临时映像构build的,并添加了编译docker源代码所需的所需包。

我希望你几乎得到你正在寻找的东西。

最近,我一直在使用https://github.com/thockin/go-build-template作为我所有项目的基础。 该模板附带一个Makefile,将在Docker中构build/testing您的应用程序。