我正在尝试使用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中的入口点是动态的。
我的困惑
如何找到解决此问题的良好标准方法?
答案 0 :(得分:13)
应用程序的配置是部署之间可能会发生变化的所有内容(阶段,生产,开发人员环境等)。这包括:
数据库,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映像外部化运行时配置,然后通过部署配置将其作为环境变量或配置注入。
答案 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)
ENTRYPOINT帮助您将容器配置为作为可执行文件运行,该可执行文件可以在运行时接受参数
任何要覆盖的动态属性都可以在运行时使用相同的图像来完成。
您可以在运行时传递必要的参数。