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

Posted

技术标签:

【中文标题】在 Docker 容器上使用 mysql 数据库的 Spring Boot 应用程序的 Maven 安装构建失败【英文标题】:Maven install build fails for spring boot application with mysql database on Docker container 【发布时间】:2020-11-08 05:59:42 【问题描述】:

要创建 jar 来为我的 Spring Boot 应用程序构建 Docker 容器,我从 Eclipse 运行 Maven Install 但构建失败并出现以下错误:

2020-07-18 20:47:52.452  INFO 5920 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-07-18 20:47:52.566  INFO 5920 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-07-18 20:48:22.960  INFO 5920 --- [  restartedMain] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-07-18 20:48:23.299  INFO 5920 --- [  restartedMain] org.hibernate.Version                    : HHH000412: Hibernate Core 5.4.9.Final
2020-07-18 20:48:23.821  INFO 5920 --- [  restartedMain] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations 5.1.0.Final
2020-07-18 20:48:54.341  WARN 5920 --- [  restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator     : HHH000342: Could not obtain connection to query metadata : HikariPool-1 - Connection is not available, request timed out after 30000ms.
2020-07-18 20:48:54.361  WARN 5920 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
2020-07-18 20:48:54.365  INFO 5920 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-07-18 20:49:03.446  INFO 5920 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2020-07-18 20:49:03.452  INFO 5920 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2020-07-18 20:49:03.522  INFO 5920 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-07-18 20:49:03.551 ERROR 5920 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

我的 spring boot 应用程序的 application.properties 文件是:

spring.datasource.username=root
spring.datasource.password=ayush123
spring.datasource.url=jdbc:mysql://mysqldb:3306/employeedb
spring.datasource.platform=mysql
hibernate.hbm2ddl.auto=update
spring.jpa.generate-ddl=true
spring.datasource.hikari.initializationFailTimeout=-1

我也试过 spring.datasource.url=jdbc:mysql://mysqldb/employeedb

我使用以下命令创建了 docker 网络并构建了 MYSQL 容器:

docker pull mysql:8.0

docker network create edrms-net

docker container run --name mysqldb --network edrms-net -e MYSQL_ROOT_PASSWORD=ayush123 -e MYSQL_DATABASE=employeedb -d mysql:8.0

docker container ls 上,我可以看到 MYSQL 容器已部署并正在运行。

我完全迷失了,无法恢复。请帮忙!

【问题讨论】:

Eclipse 是否以某种方式将应用程序作为edrms-net 网络中的容器运行?否则,您无法从外部直接连接到 DNS 容器名称。例如:***.com/questions/44780571/… edrms-net 是一个桥接网络。我可以在主机模式下发布这个网络来实现我想要的吗?因为在尝试创建新的主机网络时,我无法创建,它给出了Error response from daemon: only one instance of "host" network is allowed。另外,让我试试建议的帖子并恢复。 在这种情况下您不需要任何网络。如果你想从 Docker 外部连接到容器,你需要发布 MySQL 端口,然后使用主机 IP。 我最终将使用 netowrk,因此从 docker 网络中运行容器。另外,我尝试将容器端口 3306 推送到 VM 端口 3306,但这并没有解决问题。 【参考方案1】:

要连接到 docker 容器内的 mySql 服务器,您必须在运行要连接到服务器的容器时发布端口。

要实现这一点,请将 --publish 3306:3306 添加到您的 docker 容器运行命令中。

【讨论】:

在将容器端口 3306 发布到 VM 端口 3306 后,我仍然遇到相同的错误。docker container ls 将 mysqldb 的端口显示为 0.0.0.0:3306->3306`,而不是如上图所示。我是否需要将我的数据源 URL 从容器名称更改为 VM IP @spring.datasource.url=jdbc:mysql://mysqldb:3306/employeedb 是的,mysqldb 名称仅对容器可用。更改为您的主机 IP,直到您作为容器运行。

以上是关于在 Docker 容器上使用 mysql 数据库的 Spring Boot 应用程序的 Maven 安装构建失败的主要内容,如果未能解决你的问题,请参考以下文章

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

从 Docker 容器中访问主机上的 MySQL 数据库

将 docker 容器中运行的 JavaScript 连接到另一个 docker 容器上运行的 MySQL 数据库

无法从Spring Boot Docker容器连接到本地MySQL数据库服务器

如何在本地的docker容器上再添加一个mysql数据库

在多台服务器上使用 mysql-server docker 容器创建 MySQL 集群