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

Posted

技术标签:

【中文标题】Java 应用程序构建失败,Mysql url 指向 Docker 容器【英文标题】:Java app build fails with Mysql url pointing to a Docker Container 【发布时间】:2020-06-06 12:37:01 【问题描述】:

我有一个需要连接到 mysql 的 Java 应用程序。

在提供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?

附:我不想指向在 localhost 上运行的 MySQL。

【问题讨论】:

你是如何构建你的 jar 的?您的主机文件中是否有一个条目指向 mysqlindocker 引用的 url?尝试在构建 jar 时跳过测试运行。 这个问题有点不清楚。您能否添加您如何运行您的 docker 容器? (通过 docker run 或 docker-compose)。另请提及您如何运行您的 Spring Boot?(使用 IDE 或通过 docker)。 我使用 mvn clean install 构建 jar。它在@Test void contextLoads() 上失败。如果我将其注释掉,我可以使用 db url 指向我的 docker 容器来构建 jar。要运行 mysql 容器,我使用 docker run -d --net=<network> --name=mysqlindocker mysql 我通过 maven 命令在本地运行我的应用程序。在 docker 中,我使用 docker run 运行它。 【参考方案1】:

我使用 mvn clean install 构建 jar。它在@Test void 上失败 上下文加载()。如果我将其注释掉,我可以使用 db url 指向我的 > docker 容器

构建 jar

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

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

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

如何解决?

    解决根本原因

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

    解决方法

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

java -jar myApp.jar --my-prop-url=jdbc:mysql://mysqlindocker:3306/dbname

【讨论】:

谢谢。这行得通。这正是我想要的,但不知道如何实现。

以上是关于Java 应用程序构建失败,Mysql url 指向 Docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

找不到 PropertySource:Spring Cloud 配置 URL 的 PKIX 路径构建失败

在 Docker 容器上使用 mysql 数据库的 Spring Boot 应用程序的 Maven 安装构建失败

java连接mysql报tcp/ip连接失败是啥原因?

SSLHandshakeException:PKIX 路径构建失败

jenkins将构建成功或失败的信息发送给指定URL(eg: pomelo采用jenkins持续集成)

无法看到 mysql 数据库时作曲家安装失败