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

应用策略

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

Dockerfile 实现

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

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

如果我需要为另一个租户构建 Docker 镜像,需要添加-Dspring.profiles.active=tenant2config
所以 Dockerfile 中的入口点是动态的。

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

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

    最佳答案

    引用自 12 Factor - Config

    您应该 而不是 为每个租户构建单独的 docker 镜像,因为二进制文件应该是相同的,并且任何运行时配置都应该通过环境注入(inject)。
    有不同的选项可以注入(inject)运行时配置

  • 环境变量

  • 不是在入口点中对配置文件进行硬编码,而是添加一个环境变量ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"] 然后从kubernetes部署配置中注入(inject)环境变量引用https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
  • 将配置文件配置挂载为配置并引用

  • 你的入口点看起来像ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] 然后将所需的配置文件挂载为 kubernetes 配置。
    无论哪种方式,都可以从 docker 镜像外部化运行时配置,并将其作为环境变量或配置通过部署配置注入(inject)。

    关于docker - 在 CI/CD 管道实现中为不同租户动态管理 Dockerfile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58483820/

    10-12 23:44