docker - 在 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 中的入口点是动态的。
我的困惑
- 可以动态管理 Dockerfile 中的入口点命令吗?
- 或者我是否需要为另一个租户添加另一个 Dockerfile?并且需要为单独的租户单独运行 docker build 命令?
我怎样才能找到一个很好的标准方法来解决这个问题?
解决方案
应用程序的配置是可能在部署(登台、生产、开发人员环境等)之间发生变化的所有内容。这包括:
数据库、Memcached 和其他支持服务的资源句柄
外部服务的凭证,例如 Amazon S3 或 Twitter
每个部署的值,例如部署的规范主机名
您不应该为每个租户构建单独的 docker 映像,因为二进制文件应该是相同的,并且任何运行时配置都应该通过环境注入。
注入运行时配置有不同的选项
- 环境变量
而不是硬编码入口点中的配置文件,而是添加一个环境变量
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]
然后从 kubernetes 部署配置中注入环境变量参考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 映像外部化,并通过部署配置将其作为环境变量或配置注入。
推荐阅读
- python - 如何计算“整洁”熊猫数据框中两个过滤变量之间的比率
- python-3.x - int() 的无效关键字参数
- php - Wordpress ACF Repeater 或 While 循环,使 1 个变量保存所有结果数据
- python - concurrent.futures.ProcessPoolExecutor 工作人员是否有可能在其父级之外生存
- python - 导入库错误:没有命名模块
- python - 如何根据数据框中的条件选择某些值?
- python - Getting CSV sheet name with python
- python - 用于匹配短语后面的单词的正则表达式
- linux - org.bluez.error.inprogress 蓝牙错误
- javascript - 有没有办法更改 SharePoint 列表中的整个列值