java - 在 docker-maven-plugin 触发的 docker 容器内运行时,Spring Boot 2 应用程序无法连接到 mysql

标签 java spring-boot docker docker-maven-plugin

该应用程序在没有 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)
application.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>
    

    关于java - 在 docker-maven-plugin 触发的 docker 容器内运行时,Spring Boot 2 应用程序无法连接到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62561348/

    相关文章:

    java - 需要默认公共(public)构造函数的服务加载器实现

    spring-boot - 在 Spring Boot 嵌入式容器中部署第三方 war

    java - Spring Boot 嵌入式 Tomcat 应用程序作为 Windows exe 文件

    docker - 将docker日志消息重定向到不同的syslog文件中(logsspout向前滚动)

    amazon-web-services - 部署到 Elastic Beanstalk 时可以指定 Dockerfile 路径吗?

    java - 从 Configuration-annotated 类注册 beans

    java - 我们如何在 Hibernate 中按日期对结果进行排序?

    java - 在 Android 中单击一个按钮即可打开 Google map !

    Java Spring Boot 加上 Spring Batch 创建 Jar 并仅运行特定作业

    docker - 从Jenkins Docker容器中旋转Docker/ECS容器