在 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 容器中运行的 JavaScript 连接到另一个 docker 容器上运行的 MySQL 数据库