【问题标题】:Running Tomcat with different resources for different environments针对不同环境使用不同资源运行Tomcat
【发布时间】:2020-11-17 04:24:06
【问题描述】:

我有一个包含三个不同数据库连接的应用程序级 context.xml,我的应用程序成功连接并针对这些数据库正常工作。将war文件添加到Tomcat Docker镜像中,容器运行良好。

但是,我真正需要的是能够在不同的环境(开发、QA 和生产)中使用不同的 context.xml 文件来调出我的 WAR 文件。每个环境都有自己的一组三个数据库连接(即唯一的 URL/用户名/密码,但资源名称相同)。

Tomcat 中是否有一种机制,我可以在启动时将环境变量传递到 Tomcat 容器中,并指定要使用的上下文文件?例如如果我有 META-INF/context_dev.xml、META-INF/context_qa.xml 和 META-INF/context_prod.xml。

或者,我应该使用其他一些不同的机制来让一个 Docker 映像与三组不同的数据库资源一起工作?

谢谢, 约翰

【问题讨论】:

  • 您可以将特定于环境的配置文件挂载到容器映像中包含的配置文件之上。这样你就可以在不同的配置文件中使用相同的镜像,而无需在配置更改时重新构建镜像。
  • 感谢您的回复,但我想将所有配置信息保留在 docker 映像中,因此不需要在其他地方维护上下文文件。当我们最终迁移到 Kubernetes 时尤其如此,它运行的服务器可能会有所不同。
  • 对于 Kubernetes,您应该为此目的使用 configmap。您可以使用 configmap 和 kustomize 有效地维护多环境配置。当您将配置存储在镜像中时,配置更改需要构建和部署镜像,这可以使用 configmaps 来避免。
  • 我想重点是“最终”这个词 :-) 我们需要一个只适用于 Docker 的中间解决方案。
  • 没有开箱即用的配置来从 Kubernetes 服务器建立 JNDI 数据源。这实际上是我一直感兴趣的研究。如果这是您想进一步讨论的内容,请加入 Tomcat 用户的邮件列表并提出该主题进行讨论。

标签: docker tomcat context.xml


【解决方案1】:

在容器和 docker 以及 kubernetes 中,ENV 变量是将配置传递给容器的方式。

您设置了您的 tomcat,因此它也将它们考虑在内并使用文件中的 ENV 名称。

对于 tomcat(与是否有容器无关),此处显示了有关如何传递 env 变量的说明:Tomcat 8 - context.xml use Environment Variable in Datasource

如何将环境变量传递给您的容器:How do I pass environment variables to Docker containers?

然后您可以使用 RAW docker 在命令行中传递您的 env 变量或使用 .env 文件。使用 ENV 变量的不同值或仅使用不同的 .env 文件更改命令即可。

【讨论】:

  • 谢谢尼古拉斯。不幸的是,我使用密码库 (weinan.io/2017/03/04/how-to-use-tomcat-vault.html) 来加密和存储数据库密码使我无法使用环境变量。该工具在 context.xml 中使用变量解决方案,我猜这会与您的建议冲突。
  • 然后,您使用 docker secrets(如果还没有的话,在您的 docker 上启用 docker swarm)将您的各种 volf 文件推送到容器中。基本上 dockers secret 的工作方式有点像卷,但经过加密并且可以安全地存储敏感数据。有更多解释:docs.docker.com/engine/swarm/secrets
【解决方案2】:

我以我上面收到的建议为灵感,做了一个对我有用的解决方案,只需进行最小的更改。基本上,我将所有环境的所有资源都放在 context.xml 中,然后我将它们命名为:

<Resource
   name="${PRODENV}/mydb1"
   XXXXXXX
/>

<Resource
   name="${PRODENV}/mydb2"
   XXXXXXX
/>

<Resource
   name="${QAENV}/mydb1"
   XXXXXXX
/>

<Resource
   name="${QAENV}/mydb2"
   XXXXXXX
/>

然后,当我启动容器时,我只需将-DPRODENV=jdbc-DQAENV=jdbc 添加到 JAVA_OPTS 环境变量中。只有我想要的两个被加载,视情况而定。其余的只是从未被引用。

【讨论】:

  • 这是解决问题的合理技术方案,但可能包含一些安全问题。您可以向开发/测试环境披露 QA 或 prod 的数据库凭据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2018-10-26
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多