【问题标题】:Can I change a database depending on the branch I am on (specified in Dockerfile)?我可以根据我所在的分支(在 Dockerfile 中指定)更改数据库吗?
【发布时间】:2021-08-31 06:54:51
【问题描述】:

我想要我的:

spring.datasource.url = jdbc:mysql://666.666.666.666/prod_very_wow

改成:

spring.datasource.url = jdbc:mysql://666.666.666.666/dev_very_wow

根据我目前所在的分支。我想我也应该在 Dockerfile 中指定它 - 我应该在 docker 的 RUN 旁边添加一个属性,该属性应该确定应该激活哪个数据源。

也就是说,当我在 master 分支上时,我希望我的应用程序连接到 prod_very_wow 和 dev_very_wow 每次我签出到 dev 或创建新功能分支时,它都由添加到 RUN mvn 包中的属性决定Dockerfile。

如果这个问题没有意义,我深表歉意,但坦率地说 - 我有点不知道如何问这个问题,所以我在谷歌上搜索答案时遇到了麻烦。 我刚刚找到了一些关于“环境变量”的线索,但是我在连接的数据源和我当前所在的分支之间找不到任何连接。

【问题讨论】:

  • 我不建议将数据库 URL 或名称直接包含在您的源代码树中,尤其是不要包含在 Dockerfile 中。我昨天写了an answer,讨论了如何使用环境变量在 Docker Compose 上下文中设置 Spring 数据库 URL。
  • 谢谢。我已经调查过了,但我不确定我是否正确理解了 Docker Compose 的用法。我目前在项目中没有一个。它的功能类似于 Dockerfiles 的管理器吗?
  • 是的。如果您通常要 docker build 一个或两个自定义图像,docker network createdocker volume create,然后是 docker run 一些容器,Compose 会为您管理这一系列步骤。
  • 感谢您的时间和信息。在这种情况下,我将研究 Docker Compose 的主题。尽管目前我已经使用了 Spring Profiles(两个 application.properties 文件)、两个 Dockerfiles(每个都使用 CMD 来运行某个配置文件 - 其中一个具有 --spring.profiles.active=prod)和两个 Jenkinsfiles 来匹配。所以现在管道接收到要运行的正确 Jenkins 文件的名称。我认为 Docker Compose 的使用会使其更加优化?

标签: java mysql spring docker branch


【解决方案1】:

根据环境处理不同配置的最佳方法是将代码与配置分离,这是应用程序十二要素原则之一。在这种情况下,您应该有一个外部配置服务器,例如 spring cloud 配置服务器,它将托管不同环境的配置文件,应用程序将根据部署的环境向该配置服务器询问正确的配置文件。

但是,如果您不想遵循这种方法,您可以在应用程序中创建不同的配置文件,并使用一个环境变量来告诉 spring 使用哪个文件。例如,在您的情况下,您可以有一个 application-local.yaml 和 application-prod.yaml,然后如果您想在 mvn package 命令的 dockerfile 中指定它,您可以使用:

RUN mvn -Dspring.profiles.activ=local package
RUN mvn -Dspring.profiles.activ=prod package

【讨论】:

  • 感谢您抽出宝贵时间调查我的问题。我不确定外部配置服务器解决方案是否可行,但我会咨询我的导师。关于第二个 - 我会将 spring.datasource.url 从 application.properties 重新定位到新创建的 application.yaml 并为第二个数据库创建第二个,对吗?但我想我仍然不明白这个解决方案如何允许根据我正在处理的分支(主或开发/功能)进行更改。有可能实现吗?还是你回答了,我只是想念它?
  • 我已经重新阅读了你的问题,我想我已经完全明白了,所以你可以在构建时(当你生成你的 docker 图像时)确定基于 gitlab 分支的环境必须是什么.我不知道这是否可能。我会说不,因为存储库中的代码不知道托管它的分支是什么。我认为解决这个问题的方法是在应该部署服务的环境本身的存储库之外拥有这些信息,在那里您可以定义哪个环境独立于托管代码的分支
  • 再次感谢您的宝贵时间。当我用尽所有可能性时,我会咨询我的导师,并且很可能 - 将您对此的看法标记为答案。 :)
  • 嘿,我的情况发生了一点变化,所以我会将您的输入标记为答案(以引导我朝着正确的方向发展)并创建第二个帖子。
猜你喜欢
  • 2016-07-28
  • 2021-12-07
  • 2014-01-18
  • 2014-04-11
  • 2018-11-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多