首页 > 解决方案 > 在 CI/CD 管道实现中为不同租户动态管理 Dockerfile

问题描述

我正在尝试使用 Docker、Kubernetes 和 Jenkins 为我的项目实施 CI/CD 管道。我的应用程序是多租户应用程序,其中数据库应用程序变量对于不同的租户来说都是不同的。

应用策略

当我构建 docker 映像时,我使用的是 Dockerfile。我将 Dockerfile 保存在我的 SVN 代码存储库中。对于每个租户,代码存储库都是相同的。当我在构建镜像时,我需要为不同的租户构建不同的镜像。

Dockerfile 实现

在我的 docker 文件中,我添加如下入口点,

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]

如果我需要为另一个租户构建 Docker 映像,需要添加
-Dspring.profiles.active=tenant2config

所以 Dockerfile 中的入口点是动态的。

我的困惑

  1. 可以动态管理 Dockerfile 中的入口点命令吗?
  2. 或者我是否需要为另一个租户添加另一个 Dockerfile?并且需要为单独的租户单独运行 docker build 命令?

我怎样才能找到一个很好的标准方法来解决这个问题?

标签: dockerdockerfile

解决方案


引用12 Factor - Config

应用程序的配置是可能在部署(登台、生产、开发人员环境等)之间发生变化的所有内容。这包括:

  • 数据库、Memcached 和其他支持服务的资源句柄

  • 外部服务的凭证,例如 Amazon S3 或 Twitter

  • 每个部署的值,例如部署的规范主机名

您不应该每个租户构建单独的 docker 映像,因为二进制文件应该是相同的,并且任何运行时配置都应该通过环境注入。

注入运行时配置有不同的选项

  1. 环境变量

而不是硬编码入口点中的配置文件,而是添加一个环境变量

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]

然后从 kubernetes 部署配置中注入环境变量参考https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

  1. 将配置文件配置挂载为配置并引用它

你的入口点看起来像

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] 然后将所需的配置文件挂载为 kubernetes 配置。

无论哪种方式,将运行时配置从 docker 映像外部化,并通过部署配置将其作为环境变量或配置注入。


推荐阅读