gpt4 book ai didi

docker - 在 CI/CD 管道实现中为不同租户动态管理 Dockerfile

转载 作者:行者123 更新时间:2023-12-03 23:39:07 25 4
gpt4 key购买 nike

我正在尝试使用 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

    An app’s config is everything that is likely to vary between deploys (staging, production, developer environments, etc). This includes:

    • Resource handles to the database, Memcached, and other backing services

    • Credentials to external services such as Amazon S3 or Twitter

    • Per-deploy values such as the canonical hostname for the deploy


    你应该 不是 为每个租户构建单独的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com