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

Zer*_*our 2 development-environment go docker

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

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

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

pap*_*pey 7

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

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

步骤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" ]
Run Code Online (Sandbox Code Playgroud)