golang 应用的部署策略,如何在生产环境中运行 golang 应用

我有一个 golang 网络应用程序,我需要部署它。我正在尝试找出如何在生产环境中运行 golang 应用程序的最佳实践。我现在的做法,很简单,

  • 只需将构建的二进制文件上传到生产环境,而实际上根本没有 prod 上的源代码。

但是我发现了一个问题,我的源代码实际上是从源代码中读取了一个config/<local/prod>.yml配置文件。如果我只是上传没有源代码的二进制文件,应用程序将无法运行,因为它缺少配置。所以我想知道这里的最佳做法是什么。

我想到了几个解决方案:

  • 上传源代码和二进制文件或从源代码构建

  • 只上传二进制文件和配置文件。

  • 移至,但我认为使用此解决方案,代码的结构化程度会降低,因为如果您有很多配置,环境变量将难以管理yml configEnv Variables

提前致谢。


眼眸繁星
浏览 383回答 3
3回答

月关宝盒

部署的良好实践是在洁净室(例如 Docker 映像)中运行可重现的构建过程并生成要部署的工件(二进制文件、配置、资产),理想情况下还可以运行一些测试来证明上次没有任何问题。将服务 - 二进制文件及其所有需要的文件(配置、辅助文件,如 systemd、nginx 或 logrotate 配置等)打包成某种包是一个好主意 - 无论是目标环境 Linux 发行版 (DPKG) 的原生包, RPM)、虚拟机映像、docker 映像等。这样您(或负责部署的其他人)就不会忘记任何文件等。一旦您有了包,您就可以使用该打包格式的本机工具轻松验证和部署(&nbsp;apt,&nbsp;yum,&nbsp;docker...) 到生产环境。对于配置和其他文件,我建议让软件从众所周知的位置读取它,或者至少可以选择在命令行参数中传递路径。如果您部署到 Linux,我建议您遵循LFHS(tldr;配置为/etc/yourapp/,二进制文件为/usr/bin/)不建议在生产环境中从源代码构建软件,因为构建需要通常不需要的工具(例如go,git依赖项等)。安装和运行这些需要更多维护,并可能导致安全和性能风险。通常,您希望根据运行应用程序的要求将生产环境保持在最低限度。

蛊毒传说

我认为应用程序最常见的部署策略是尝试遵循 12-factor-app方法论。因此,在这种情况下,如果您的 YAML 文件是配置文件,那么将配置放在环境变量(ENV vars)上会更好。因此,当您在容器上部署应用程序时,从 ENV 变量配置正在运行的实例比将配置文件复制到容器更容易。但是,在编写系统软件时,最好遵守您所使用的操作系统定义的文件系统层次结构。如果您使用的是类 Unix 系统,您可以通过man hier在终端上键入来读取层次结构。通常,我将编译后的二进制文件安装在/usr/local/bin目录中,并将配置放在/usr/local/etc.对于生产环境的部署,我创建了一个简单的 Makefile 来完成构建和安装过程。如果部署环境是裸机服务器或虚拟机,我通常使用 Ansible 使用 ansible-playbook 进行部署。playbook 将从代码存储库中获取源代码,然后通过运行make命令构建、编译和安装软件。如果应用程序将部署在容器上,我建议您创建一个镜像并使用多阶段构建,这样构建二进制文件所需的源代码和其他工具就不会在生产环境中,并且镜像大小会更小。但是,正如我之前提到的,从 ENV 变量而不是配置文件中读取应用程序配置是一种常见的做法。如果应用程序需要配置很多东西,则可以在构建映像时将文件复制到映像中。

慕码人2483693

当我们等待提案时::cmd/go支持在二进制文件中嵌入静态资产(文件)来实现(请参阅当前提案),您可以使用该提案中列出的嵌入静态资产文件工具之一。这个想法是将您的静态文件包含在您的可执行文件中。这样,您可以分发您的程序而不依赖于您的来源。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go