为不同环境创建图像的最佳方法

Posted

技术标签:

【中文标题】为不同环境创建图像的最佳方法【英文标题】:Best way to create image for different environment 【发布时间】:2021-11-29 05:39:12 【问题描述】:

针对不同环境维护图像的最佳方法是什么?为什么?

选项:1 为特定环境 dev、stg、prod 创建差异图像。我们必须告诉 Jenkins 作业我们正在为哪个环境构建映像,spring boot 将加载特定的配置文件。 优点 : 环境特定图像。 缺点: 每个环境都会有不同的图像,所以我们必须每次都构建它。

选项:2 构建 1 个镜像,外部化配置文件。在构建映像时,创建一个共享/挂载路径,放置一个适当的配置文件。初始化时加载配置文件。 优点: 所有环境都可以使用一张图像。 缺点: 自定义配置处理。 需要 2 个团队之间的协调。

如果有其他选择,请告诉我上述方法或任何其他方法的优缺点。

【问题讨论】:

选项 3,在 K8s 配置图中指定特定于环境的覆盖。或 Docker Compose 中的环境变量或您正在使用的任何内容。我会避免构建不同的图像。 @BoristheSpider 需要 2 个团队之间的协调。有什么方法可以从我的资源文件夹中读取配置并使其在运行时可用? 您可以使用弹簧配置文件,然后为环境设置配置文件或以其他方式触发它。协调方面仍然存在 - 因为服务团队需要维护每个环境的配置并与环境所有者协调以确保配置正确。 【参考方案1】:

构建一次并随处部署被认为是持续交付的基本原则(谷歌它的优势)。所以我会为所有环境构建相同的图像。并且在运行镜像时,它需要有一些方法来允许根据环境配置这些配置。

就 docker 而言,它允许在运行容器时配置环境变量(例如,在 docker-compose 的情况下参见 this)

在spring-boot方面,OS环境变量会overrideapp中的应用属性。

【讨论】:

我要补充一点:IME Spring 配置文件不适合这种设置,因为这意味着如果运营团队发生变化,您必须重新构建所有内容以更新 jar 文件中内置的属性主机名。主要使用环境变量配置应用程序。 同意配置应该主要通过 OS env 进行配置。多变的。 spring-boot 确实允许配置将通过 OS env 启用哪些配置文件。变量SPRING_PROFILES_ACTIVE【参考方案2】:

在设计图像时,将文件系统和环境分成 3 部分。

    运行应用程序所需的二进制文件、运行时、库、代码。这属于你的形象。 对于映像的不同用户而言,配置和机密会有所不同。这些属于在运行时注入的配置文件和环境变量(作为绑定挂载、docker-compose.yml 环境变量、k8s 配置映射等)。 数据。这应该作为卷安装,或者安装在使用配置/密码访问的外部数据库中。

这与 12 factor 的设计保持一致,并实现了可移植性、更轻松的测试以及将与 CI 中测试的不同的东西部署到生产中的风险更低。

【讨论】:

【参考方案3】:

您可以为每个环境分别构建 docker 映像。

例如:从.env.dev文件中读取dev environment的变量。

【讨论】:

以上是关于为不同环境创建图像的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

存储二进制或图像文件的最佳方式

将特定于语言环境的字符串转换为 BigDecimal 的最佳方法

为 Django 创建开发环境

为依赖于环境变量的代码编写规范的最佳方法是什么?

寻找测试不同 PHP 版本的最佳环境 [关闭]

在 SQL Server 中为关键数据库还原数据库的最佳方法