基本上就是标题所说的...是否有最佳实践或有效方法来开发将被 Dockerized 的 Golang 应用程序?我知道您可以挂载卷以指向您的源代码,它非常适用于不需要编译代码的 PHP 等语言。但是对于 Go 来说,与 Docker 一起开发似乎会很痛苦,因为我猜你几乎只有两个选择。
首先是要有一个 Dockerfile,它只是 onbuild 这样它会在容器运行时启动 go 应用程序,因此必须在每次更改时构建一个新图像(无论它是否很小)。或者,您确实将源代码目录挂载到容器目录,然后附加到容器本身并像往常一样自己手动构建/运行。
这两种方式实际上是我看到它发生的唯一方式,除非你不在 docker 容器中开发你的 Go 应用程序。只需像往常一样开发它,然后使用临时镜像方法将 Go 预先构建为二进制文件,然后在准备好运行时将其复制到容器中。我认为这可能是可行的方法,但我想就此问题询问更多专业人士,并可能获得有关该主题的一些反馈。
最佳答案
不确定这是最好的做法,但这是我的方式。
- Makefile 是强制性的
- 使用我的本地机器和我的 go 工具进行小的迭代
- 使用基于golang:{1.X,latest}的专用构建容器,挂载代码目录构建release,主要是保证我的代码在CI上正确构建。 (提示,这是我用于发布构建的标准 go build 命令:
CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
) - 测试代码
- 然后使用
FROM scratch
构建发布容器(复制bin+入口点) - 将您的图像推送到您的注册表
步骤 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" ]
关于docker - 开发在 Docker 容器中运行的 Golang 应用程序的最佳实践/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44061696/