Tomcat 的 Spring 应用程序属性与 docker 容器链接

Tomcat's Spring app properties with docker container linking

我一直在玩 docker。

我有我的 mysql 容器

docker 运行 --name mymysql -d mysql/mysql-server:5.6

我的 tomcat 部署我的应用程序的容器

docker 运行 --link mymysql:mysql -d 我的 tomcat

在 tomcat 容器中我可以看到(因为 linking)

..
MYTOMCAT_PORT_8080_TCP_ADDR=172.17.0.55
..

and in the /etc/hosts
172.17.0.55 mysql

在我的 spring 应用程序中,我以这种方式管理属性

    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
        <value>classpath:${env}/myapp.properties</value>
      </list>
    </property>
  </bean>

where depending on the configuration (prop variable is set -Denv=qa in the JAVA_OPTS of tomcat)

在 qa/myapp.properties 我有例如 mysql link

databaseUrl=jdbc:mysql://mysql:3306/mydb

其中 'mysql' 是 mysql docker 图像的名称,与 tomcat 容器的 /etc/hosts 相同

我想知道我处理事情的方式是否被认为是好的做法? 是否有 easier/cleverer 处理属性的方法?我的 java 应用程序被强烈 link 编辑到我的 docker 图像的名称这一事实让我有点困扰。

我想在 tomcat 容器上有一种 运行 使用 ENV 变量 (MYTOMCAT_PORT_8080_TCP_ADDR) 构建最终 may.properties 的脚本/etc/hosts 值。这是更好的解决方案吗?

我刚刚自己解决了这个问题。为了不将您的 mysql 数据库容器紧密耦合到您可以使用另一个 JAVA_OPTS 或 CATALINA_OPTS 来传递您的 mysql url 然后在您的 databaseUrl 中使用.因此,对于您的示例,您可以这样做:

docker run --link mysql_container:mysql -e JAVA_OPTS="-Denv=qa -Dmysql_url=//mysql:3306"

然后在您的连接配置中:

databaseUrl=jdbc:mysql:${mysql_url}/mydb

如果其中有任何不合理的地方,请告诉我。我找到的许多例子都没有给我完整的答案,所以我可以理解你是否需要更多信息。