我正在尝试使用 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 中的入口点是动态的。
我的困惑
我怎样才能找到一个很好的标准方法来实现这个问题?
最佳答案
引用自 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/