开发Golang应用程序以在Docker容器中运行的最佳实践/方法
基本上标题说什么…是否有一个最佳实践或有效的方法来开发一个将被Docker化的Golang应用程序? 我知道你可以装载卷来指向你的源代码,对于PHP等语言来说,它不需要编译你的代码。 但是对于Go来说,与Docker一起开发似乎是一件痛苦的事情,因为我猜你几乎只有两种select。
首先会有一个Dockerfile,它只是onbuild,所以当一个容器运行时,它启动的应用程序,因此不得不build立一个新的形象,每一个变化(无论是否小)。 或者,你可以将你的源代码目录安装到容器目录中,然后附加到容器本身,并像通常一样执行手动生成/运行。
这两种方式实际上是我看到它发生的唯一方式,除非您不在Docker容器中开发您的Go应用程序。 只要正常开发它,然后使用临时图像的方法,你预先生成一个二进制文件,然后将其复制到您的容器,当你准备好运行它。 我认为这可能是要走的路,但我想问更多的专业人士,也许会得到一些关于这个话题的反馈。
不知道这是最好的实践,但这是我的方式。
- Makefile是强制性的
- 使用我的本地机器和我的工具进行小的迭代
- 使用基于golang的专用构build容器:{1.X,latest},安装代码目录来构build一个发行版,主要是为了确保我的代码能够在CI上正确构build。 (提示,这里是我的标准去构build发布命令的命令:
CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
) - testing代码
- 然后使用
FROM scratch
构build一个发布容器(复制bin +入口点) - 将您的图像推送到您的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您的应用程序。