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

时间:2017-05-19 04:50:42

标签: docker go development-environment

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

首先要有一个只是onbuild的Dockerfile,这样它就可以在运行容器时启动go app,因此必须在每次更改时构建一个新图像(无论它是否小)。或者,您将源代码目录挂载到容器目录,然后附加到容器本身并执行手动构建/运行,就像您通常一样。

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

3 个答案:

答案 0 :(得分:7)

不确定这是最好的实践,但这是我的方式。

  1. Makefile是MANDATORY
  2. 使用我的本地计算机和我的go工具进行小规模迭代
  3. 使用基于golang的专用构建容器:{1.X,latest},mount代码目录来构建版本,主要是为了确保我的代码能够在CI上正确构建。 (提示,这是我发布版本的标准go build命令:CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
  4. 测试代码
  5. 然后使用FROM scratch构建一个发布容器(复制bin +入口点)
  6. 将图片推送到您的注册表
  7. 步骤3到6是CI的任务。

    重要提示:由于新的多阶段构建功能,这种情况正在发生变化:https://docs.docker.com/engine/userguide/eng-image/multistage-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" ]
    

答案 1 :(得分:1)

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

答案 2 :(得分:0)

据我所知,您希望有一个正在运行的容器来开发golang应用程序。同样的事情也可以在你的主机上完成。但好的是,如果您可以构建此类应用程序,那么这将被视为云平台即服务(PaaS)。

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

我建议你看一下docker开发环境。 https://docs.docker.com/opensource/project/set-up-dev-env/

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

我希望你几乎得到你想要的东西。