java - Spring Boot 2 应用程序在 docker-maven-plugin 触发的 docker 容器内运行时无法连接到 mysql
问题描述
该应用程序在不使用 docker 运行时连接得很好mvn spring-boot:run
。使用mvn docker:remove docker:stop clean package docker:build docker:start
以下错误运行时抛出
错误:
[main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.DatabaseException: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
应用程序.yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/db?user=root&createDatabaseIfNotExist=true
username: root
password: new_password
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
connection-timeout: 20000
idle-timeout: 10000
liquibase:
enabled: true
pom.xml
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.33.0</version>
<extensions>true</extensions>
<executions>
<execution>
<id>docker-build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>prepare-database</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>remove-database</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
<configuration>
<images>
<image>
<name>mysql</name>
<alias>database</alias>
<run>
<log>
<prefix>mysql > </prefix>
<enabled>true</enabled>
<color>green</color>
</log>
<env>
<MYSQL_ROOT_PASSWORD>${db.password}</MYSQL_ROOT_PASSWORD>
<MYSQL_DATABASE>${db.name}</MYSQL_DATABASE>
<MYSQL_PASSWORD>${db.password}</MYSQL_PASSWORD>
</env>
<ports>
<port>3306:3306</port>
</ports>
<wait>
<log>(?s)ready for connections</log>
<time>30000</time>
</wait>
</run>
</image>
<image>
<alias>service</alias>
<name>service</name>
<build>
<from>java:8-jre</from>
<cmd>
<shell>java -jar /maven/mysql-producer-consumer-1.0-SNAPSHOT.jar</shell>
</cmd>
<assembly>
<descriptorRef>artifact-with-dependencies</descriptorRef>
</assembly>
</build>
<run>
<log>
<prefix>service > </prefix>
<enabled>true</enabled>
<color>black</color>
</log>
<wait>
<shutdown>500</shutdown>
<time>20000</time>
</wait>
<dependsOn>
<container>mysql</container>
</dependsOn>
</run>
</image>
</images>
</configuration>
</plugin>
更改datasource
url
为以下值无效:
jdbc:mysql://mysql/db?user=root&createDatabaseIfNotExist=true
jdbc:mysql://database/db?user=root&createDatabaseIfNotExist=true
jdbc:mysql://localhost/db?user=root&createDatabaseIfNotExist=true
解决方案
以下更改有效:
改变url: jdbc:mysql://127.0.0.1:3306/db?user=root&createDatabaseIfNotExist=true
添加network
:
<image>
<alias>service</alias>
<name>service</name>
<build>
<from>java:8-jre</from>
<cmd>
<shell>java -jar /maven/mysql-producer-consumer-1.0-SNAPSHOT.jar</shell>
</cmd>
<assembly>
<descriptorRef>artifact-with-dependencies</descriptorRef>
</assembly>
</build>
<run>
<log>
<prefix>service > </prefix>
<enabled>true</enabled>
<color>black</color>
</log>
<network>
<mode>container</mode>
<name>mysql</name>
<alias>mysql</alias>
</network>
<wait>
<shutdown>500</shutdown>
<time>20000</time>
</wait>
<dependsOn>
<container>mysql</container>
</dependsOn>
</run>
</image>
更改 MySQL 容器的等待时间:
<wait>
<time>20000</time>
</wait>
推荐阅读
- r - excel countif 函数是否有 R 等效项?
- r - 如何使用 r 中的 S4 类输出进行代数计算,as.bob()
- php - Laravel 将数组数据格式化为表格
- css - 当我们在 ngb 模式中加载网格并滚动时,Slickgrid 网格菜单不会与网格一起移动
- javascript - 控制台中的“未捕获的 SyntaxError:意外的标识符”
- angular - Capacitor 3 并且没有导出成员 PushNotification
- php - Symofny:多次出现输入
- karma-jasmine - Angular Firestore jasmine 测试条件在 colleciton 中
- django - 是否可以在制作 DjangoModelFactory 时获取工厂男孩 Faker 对象的值以用于另一个字段
- css - CSS - 使用 max 为特定长度的 minmax 时,网格自动调整不起作用