Java应用程序构建失败,其中Mysql url指向Docker容器

时间:2020-02-22 06:07:39

标签: spring spring-boot docker spring-mvc

我有一个Java应用程序,需要连接到MySQL。

提供url: jdbc:mysql://localhost:3306/<dbname>后,我便可以制造Jar。但是,我想在网络中的Docker容器上运行它,同时我也有一个名称为mysqlindocker的MySQL容器正在运行。为了构建Jar,我将URL放置为jdbc:mysql://mysqlindocker:3306/<dbname>,希望可以在容器内运行。但是我做不到,因为构建失败。我的猜测是,在我的本地计算机上,Spring无法指向该数据库URL。

如何构建一个URL为jdbc:mysql://mysqlindocker:3306/<dbname>的jar?

P.S。我不希望指向在本地主机上运行的MySQL。

1 个答案:

答案 0 :(得分:1)

我使用mvn clean install构建jar。它在@Test无效时失败 contextLoads()。如果我将其注释掉,则可以使用db url指向我的> docker容器来构建jar

在maven的test阶段执行的单元测试框架中,mysqlindocker主机名无法解析:

jdbc:mysql://mysqlindocker:3306/<dbname>

只有相同docker网络中的容器才能解决该问题。
由于这些测试是在容器外部执行的(确切地说是在启动之前),因此它们无法访问该网络。

如何解决?

1)解决了根本原因

实际上,在单元测试执行期间构建失败的根本原因是您没有根据目标范围定义jdbc url。
实际上,在Maven构建的test阶段,您通常希望测试使用内存数据库或特定的MySQL数据库。出于一致的原因(测试可重复性),您不想使用与主应用程序中使用的相同的一种。 在这里,一个好的做法是使用另一个数据库实例进行单元测试,并且应该可以从运行构建(localhost)的主机上访问该数据库。
您可以覆盖已执行测试的spring.datasource.url属性:通过在application-test.properties/yml中定义src/test/resources文件,或直接在测试类@SpringBootTest(properties=...)中覆盖此属性。

2)解决方法

请注意,如果将MySQL数据库容器端口发布在执行构建的主机上,则(临时)解决方法是将localhost保留在spring.datasource.url中为构建定义的url中,并用将JAR作为容器端点运行时,运行时的Docker容器名称:

java -jar myApp.jar --spring.config.location=jdbc:mysql://mysqlindocker:3306/dbname