【问题标题】:Best practice/way to develop Golang app to be run in Docker container开发 Golang 应用程序以在 Docker 容器中运行的最佳实践/方法
【发布时间】:2017-05-19 04:50:42
【问题描述】:

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

首先是拥有一个仅 onbuild 的 Dockerfile,因此它在容器运行时启动 go 应用程序,因此必须在每次更改时构建一个新映像(无论它是否小)。或者,您确实将源代码目录挂载到容器目录,然后附加到容器本身并像往常一样手动执行构建/运行。

这两种方式确实是我看到它发生的唯一方式,除非您只是不在 docker 容器中开发您的 Go 应用程序。只需像往常一样开发它,然后使用临时映像方法将 Go 预构建为二进制文件,然后在准备运行时将其复制到容器中。我认为这可能是要走的路,但我想就该主题询问更多专业人士,并可能获得有关该主题的一些反馈。

【问题讨论】:

  • 为什么会被否决?有的话请回答,不要无礼。这是一个合理的问题。并不是每个人都对新技术了如指掌。

标签: docker go development-environment


【解决方案1】:

不确定这是最好的做法,但这是我的方式。

  1. Makefile 是强制性的
  2. 使用我的本地机器和我的 go 工具进行小迭代
  3. 使用基于golang:{1.X,latest}的专用构建容器,挂载代码目录构建一个release,主要是保证我的代码能在CI上正确构建。 (提示,这是我用于发布构建的标准 go build 命令:CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
  4. 测试代码
  5. 然后使用FROM scratch构建发布容器(复制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" ]

【讨论】:

  • 我喜欢你的方法,而且看起来最快的方法。在每次更改源代码时构建新映像只会占用太多的开发时间。因此,使用您的主机来开发大部分内容然后在 Docker 中测试里程碑是有意义的。此外,多阶段构建看起来非常不错
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 理想情况下,这就是它的要点。尝试使开发人员和环境之间的开发相似,这是 Docker 所吹捧的。到目前为止,我只使用过 PHP 和 Docker,因此使用 Docker 容器进行开发相当简单。我想像 Go 这样的编译语言会更烦人,这就是我问的原因。但我可能对你的回答有些困惑。您的答案是否更倾向于拥有一个您可以在其中完成所有工作的开发环境,而不仅仅是一个项目?
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多