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

时间:2019-10-21 09:53:31

标签: docker 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中的入口点是动态的。

我的困惑

  1. 可以动态地管理Dockerfile中的入口点命令吗?
  2. 还是我需要为另一个租户添加另一个Dockerfile?是否需要为单独的租户单独运行docker build命令?

如何找到解决此问题的良好标准方法?

3 个答案:

答案 0 :(得分:13)

引用12 Factor - Config

  

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

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

  •   
  • Amazon S3或Twitter之类的外部服务的凭据

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

  •   

您应该为每个租户构建单独的docker映像,因为二进制文件应该相同,并且任何运行时配置都应通过环境注入。

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

  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 :(得分: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"]

答案 2 :(得分:0)

引荐-Dockerfile Best Practices

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

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

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