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


13

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

我如何找到实现此问题的良好标准方法?


3
您可以在ENTRYPOINTie中使用环境变量,... -Dspring.profiles.active=${TENANT}然后在部署期间设置正确的环境。
masseyb

Answers:


13

12因素报价-配置

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

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

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

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

你应该为每个租户建立独立的泊坞窗图像作为二进制应该是相同的,任何运行时配置应通过环境注入。

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

  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映像外部化运行时配置,然后通过部署配置将其作为环境变量或配置注入。


1
SPRING_PROFILES_ACTIVE作为环境变量应该开箱即用。不需要java附加参数。
Manuel Polacek

3

您可以使用docker ARGS,它仅在构建时可用,并且可以在入口点使用。

docker build --build-arg CONFIG_FILE=<file_name> -t tag_name .

CONFIG_FILE将保存配置文件的位置,您可以动态传递它。将您的入口点替换为$CONFIG_FILE

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

ARG CONFIG_FILE-应在Dockerfile中声明
Roman M

0

参考-Dockerfile最佳实践

ENTRYPOINT帮助您将容器配置为作为可执行文件运行,该可执行文件可以在运行时接受参数

您想覆盖的任何动态属性都可以在运行时使用相同的图像来完成。

您可以在运行时传递必要的参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.