mysql - 使用 mysql 容器的 Spring Boot 应用程序可以工作,但是使用 Spring Boot 应用程序容器则不行

标签 mysql spring docker docker-compose

我正在尝试在链接到 docker mysql 容器的 docker 容器内运行 spring boot 应用程序。当我尝试运行带有 spring boot 应用程序的 docker 容器时,我收到以下错误:

017-12-21 14:13:12,587 INFO  [localhost-startStop-1] VersionPrinter : Flyway 4.2.0 by Boxfuse
2017-12-21 14:13:12,590 INFO  [localhost-startStop-1] HikariDataSource : HikariPool-1 - Starting...
2017-12-21 14:13:13,913 ERROR [localhost-startStop-1] HikariPool : HikariPool-1 - Exception during pool initialization.
com.mysql.jdbc.exceptions.jdbc4.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 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:461)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2189)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2222)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2017)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:461)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123)
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:375)
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:204)
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:459)
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:533)
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:114)
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:97)
        at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:51)
        at org.flywaydb.core.Flyway.execute(Flyway.java:1418)
        at org.flywaydb.core.Flyway.migrate(Flyway.java:971)
        at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1769)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1706)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:304)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1013)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:335)
        at org.springframework.orm.jpa.EntityManagerFactoryUtils.findEntityManagerFactory(EntityManagerFactoryUtils.java:121)
        at org.springframework.orm.jpa.EntityManagerFactoryAccessor.setBeanFactory(EntityManagerFactoryAccessor.java:154)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1732)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1697)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference(ConfigurationClassEnhancer.java:392)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:364)
        at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration$$EnhancerBySpringCGLIB$$f8138739.openEntityManagerInViewInterceptor(<generated>)
        at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration.addInterceptors(JpaBaseConfiguration.java:242)
        at org.springframework.web.servlet.config.annotation.WebMvcConfigurerComposite.addInterceptors(WebMvcConfigurerComposite.java:88)
        at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration.addInterceptors(DelegatingWebMvcConfiguration.java:83)
        at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.getInterceptors(WebMvcConfigurationSupport.java:332)
        at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerMapping(WebMvcConfigurationSupport.java:284)
        at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.requestMappingHandlerMapping(WebMvcAutoConfiguration.java:478)
        at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$19c5cac1.CGLIB$requestMappingHandlerMapping$1(<generated>)
        at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$19c5cac1$$FastClassBySpringCGLIB$$68349f44.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361)
        at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$19c5cac1.requestMappingHandlerMapping(<generated>)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:538)

当我尝试运行 spring boot 应用程序而不将其放在 docker 容器中时,与 mysql 容器的连接有效。

这是我用于 Spring Boot 应用程序的 application.yml:

server:
    port: 8081

spring:
    datasource:
        username: root
        password: root
        testWhileIdle: true
        validationQuery: SELECT 1
        jdbcUrl: jdbc:mysql://127.0.0.1:6603/data
        type: com.zaxxer.hikari.HikariDataSource
    jpa:
        show-sql: true
        generate-ddl: false
        hibernate:
            ddl-auto: none
            naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy

flyway:
    datasource:
        username: root
        password: root
        jdbcUrl: jdbc:mysql://127.0.0.1:6603/data
        type: com.zaxxer.hikari.HikariDataSource
        flyway:
            locations: classpath:/db/migration


logging:
    file: logs/cookbook-journal.log
    pattern:
        console: "%d %-5level [%thread] %logger{0} : %msg%n"
        file: "%d %-5level [%thread] %logger{0} : %msg%n"
    level:
        root: INFO
        org.springframework.security: DEBUG

security:
 oauth2:
   resource:
     userInfoUri: http://localhost:8081/me

对于 Dockerfile:

FROM java:9

ADD target/ /opt/cookbook-journal/

ENTRYPOINT ["/usr/bin/java", "-jar", "/opt/cookbook-journal/CookbookJournalBackend.jar"]

和 docker-compose.yml 用于在 docker 网络中运行两个容器:

version: '3'
services:
  mysql:
    image: cookbook-mysql
    container_name: mysql
    ports:
      - "6603:3306"
    networks:
      - bridge
  backend:
    image: cookbook-backend-img
    container_name: server
    ports:
      - "8081:8081"
    depends_on:
      - mysql
    links:
      - mysql
    networks:
      - bridge
networks:
  bridge:
    driver: bridge

[编辑] 这是 mysql 容器的 Dockerfile:

FROM mysql
ENV MYSQL_HOST=mysql
ENV MYSQL_DATABASE=data
ENV MYSQL_ROOT_PASSWORD=root

RUN echo [mysqld] > /etc/mysql/my.cnf
RUN echo lower_case_table_names=1 >> /etc/mysql/my.cnf

大家都遇到过这样的问题吗?

谢谢!

最佳答案

您已经链接了 mysql 容器,请尝试。

spring:
    datasource:
        jdbcUrl: jdbc:mysql://mysql:3306/data

flyway:
    datasource:
        jdbcUrl: jdbc:mysql://mysql:3306/data

关于mysql - 使用 mysql 容器的 Spring Boot 应用程序可以工作,但是使用 Spring Boot 应用程序容器则不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926865/

相关文章:

java - Spring Security 和 JSF,找不到资源/j_spring_security_check.jsp

macos - 适用于 Mac 的 Docker - 哈希和不匹配

php - 如何使用 php 和 mysql 上传图像文件夹

c# - LIKE 的 SQL 语法帮助

java - 尝试使用 Spring Boots 的 RestTemplate 来使用内容类型 [text/json]

mysql - 本地运行的Docker容器无法建立与远程MySQL数据库的连接

amazon-web-services - Docker在为节点应用程序运行npm install时引发错误

mysql - Laravel WHERE 子句与 AND

php - 在另一个字符串中的某个单词之前插入字符串

java - 我可以要求 JDBCTemplate 扩展列表参数以在 in() 子句中使用吗?