为golang应用程序构建docker容器而不调用go build

为golang应用程序构建docker容器而不调用go build,docker,go,dockerfile,Docker,Go,Dockerfile,我正在为go应用程序构建我的第一个Dockerfile,我不明白go build或go install是否被视为docker容器的必要部分 我知道使用muilt stage可以避免这种情况,但我不知道为什么它会被放在容器图像中 我所期望的是: 我有一个go应用程序“go awesome” 我可以从cmd/go-awesome本地构建它 我的Dockerfile包含的内容不超过 好的,太棒了 CMD[“非常棒”] 这种配置的缺点是什么?相反,我能从中得到什么 复制 快跑,快跑,快跑 运行g

我正在为go应用程序构建我的第一个Dockerfile,我不明白
go build
go install
是否被视为docker容器的必要部分

我知道使用muilt stage可以避免这种情况,但我不知道为什么它会被放在容器图像中

我所期望的是:

  • 我有一个go应用程序“go awesome”

  • 我可以从cmd/go-awesome本地构建它

我的Dockerfile包含的内容不超过

好的,太棒了

CMD[“非常棒”]

这种配置的缺点是什么?相反,我能从中得到什么

复制

快跑,快跑,快跑

运行go安装

链接到显示作为Dockerfile一部分构建go应用程序的帖子


您可以在本地编译应用程序,只需将可执行文件复制到合适的docker映像中,这是正确的

但是,在docker构建中编译应用程序有很多好处,特别是对于具有多个协作者的大型项目。具体而言,我想到了以下原因:

  • 构建应用程序源不需要本地依赖项(docker除外)。有人甚至不需要安装。这对于使用多种语言的项目尤其有价值。考虑一个可能想在GO项目中编辑HTML模板的人,看看容器运行时的样子。<李>
  • 构建环境(go版本、依赖关系管理、文件路径…)是恒定的。可以通过Dockerfile安全地管理和维护任何外部依赖项

我绝对同意您的意见,即在您的最后一个链接中遵循“方式2”。在容器中构建似乎很荒谬,可能是因为人们习惯了容器中的Node或Ruby之类的东西而留下来的。这与在本地构建一个节点项目,然后只复制/运行dockerfile有什么不同?它似乎与复制一个节点项目没有什么不同,这就是为什么让我困惑的是,我在“DokCURE GO容器”上看到的每一篇博客文章都认为这是默认行为。当然,go应用程序可以独立运行。你永远不想部署一个二进制文件,它不是在一个干净、可复制的环境中构建的。如果你在docker容器中构建二进制文件(我建议在一个容器中构建多级文件,然后转移到一个较小的部署容器),你可以免费获得它;另外,由于节点应用程序需要安装节点才能运行,因此在容器外部构建的好处微乎其微。有了Go,操作环境根本就没有理由安装Go,而且它对构建和操作环境之间的差异也不是特别敏感。这是一个有用的观点——任何人都可以将外壳装入容器并自由地进行更新。这似乎仍然是一个罕见的用例——为什么要在github存在的情况下在容器中四处闲逛呢?也许docker超级用户会觉得它更直观。对于具有非全堆栈开发人员的多语言应用程序,我可以看到一些潜在的(尽管很小)优势。如果您有一台CI构建服务器进行构建,那么第二点似乎没有意义。@Adrian可能对生产/发布部署没有意义。但这肯定有利于开发过程。我不想浪费时间与我的同事和合作者争论代码是否有问题,或者这只是一个与构建环境中的某些模糊差异有关的问题。@k切记:我维护的许多应用程序的Dockerfile只是将编译后的可执行文件复制到一个临时映像中。它很简单,工作也很好。我们还有其他工具来协调如何构建这些可执行文件,这就是为什么它在许多系统/应用程序中都能很好地工作。但我还有其他几个应用程序具有更复杂的依赖关系(主要是CGo构建环境),对于这些应用程序来说,多阶段构建非常有用。它主要只是让其他人更容易构建docker映像。尤其是当你试图创建一个微小的图像时。对于编译一个go可执行文件的情况,您只需将其放入一个临时映像中,就需要对build命令应用几个附加参数。你可以把它写在自述文件中(不是每个人都会看到),提供一个脚本来实现它(不是每个人都会使用它),或者你可以将它烘焙到docker构建本身中。。。