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

共3个回答,已解决, 标签: docker dockerfile

这个赏金已经结束。这个问题的答案有资格获得 100 的声誉奖金。赏金宽限期在 19 小时内结束。了解更多. 雅各布正在寻找一个规范答案.

我试图使用 Docker 、 Kubernetes 和 Jenkins 为我的项目实现 CI/CD 管道。我的应用程序是多租户应用程序,其中数据库应用程序变量对于不同的租户来说一切都是不同的。

应用策略

当我建立一个码头工人形象我使用 Dockerfile。我把我的 Dockerfile 放在我的 SVN 代码库中。对于每个租户,代码库都是相同的。当我建立一个形象时,当时我需要为不同的租户建立不同的形象。

Dockerfile 实现

在我的 docker 文件中,我添加了以下入口点,

入口点 [“java” 、 “-jar” 、 “-Dspring.profiles.active = tenant1config” 、 “TestProject.war”]

如果我需要为另一个租户构建 Docker 映像,需要添加
-Dspring.profiles.active=tenant2config

所以 Dockerfile 中的入口点是动态的。

我的困惑

  1. 用于管理 Dockerfile 中的入口点命令可以通过动态?
  2. 或者我需要为另一个租户添加另一个 Dockerfile?需要为单独的租户单独运行 docker 构建命令?

我如何找到一个很好的标准方法来实现这个问题?

第1个答案(采用)

引用12 因素配置

应用程序的配置是在不同部署 (临时、生产、开发环境等) 之间可能有所不同的一切。这包括:

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

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

  • 按部署值,如部署的规范主机名

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

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

  1. 环境变量

不要在入口点硬编码配置文件,而是添加一个环境变量

入口点 [“java” 、 “-jar” 、 “-Dspring.profiles.active = $ TENANT_PROFILE” 、 “TestProject.war”]

然后从 kubernetes 部署配置中注入环境变量Https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

  1. 将配置文件配置作为配置文件挂载并引用它

你的入口看起来像

入口点 [“java” 、 “-jar” 、-spring.config.location = “文件:/path/to/tenantconfig.yaml” 、 “TestProject.war”] 然后将所需的配置文件安装为 kubernetes 配置。

无论哪种方式,从 docker 映像外部化运行时配置,并通过部署配置将其作为环境变量或配置注入。

第2个答案

您可以使用 docker ARGS,这将只在构建时可用,这可以在入口点使用。

Docker 构建-arg CONFIG_FILE =-T tag_name。

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

入口点 [“java” 、 “-jar” 、 “-Dspring.profiles.active = $ CONFIG_FILE” 、 “TestProject.war”]
第3个答案

参考-Dockerfile 最佳实践

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

任何你想重写的动态属性,都可以在运行时用相同的图像来完成。

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

相关问题

MSBuild 未处理异常: 除非设置了 UseShellExecute,否则 FileName 属性不应是目录 如何解决 Alpine docker 容器内烧瓶应用 Gunicorn exec 上提出的 “oserror: libc 未找到” 缺少 inotify 事件 (在。Git 目录 在 CI/CD 管道实现中为不同租户动态管理 Dockerfile E: 在使用 docker compose 的 php-fpm 映像构建中,包 “mysql-client” 没有安装候选