【问题标题】:spring boot+mysql+docker+travis when building in travis getting mysql connection failrespring boot + mysql + docker + travis在travis中构建时出现mysql连接失败
【发布时间】:2020-11-05 15:51:55
【问题描述】:

我是 docker 新手。我已经用 mysql 配置了 spring boot 并编写了 docker 和 docker compose 如下所示。我在本地提供了 docker-compose -f docker-compose.yml up --build ,它在本地运行良好。当我将它推送到 GIT 并且当 travis 将它捡起时,我在 travis 日志中得到以下异常。我认为它无法连接到mysql。

    mysql-standalone_1_3deba3f11bd1 | 2020-11-05T15:41:27.929272Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
    mysql-standalone_1_3deba3f11bd1 | 2020-11-05T15:41:27.938951Z 0 [Note] Event Scheduler: Loaded 0 events
    mysql-standalone_1_3deba3f11bd1 | 2020-11-05T15:41:27.939205Z 0 [Note] mysqld: ready for connections.
    mysql-standalone_1_3deba3f11bd1 | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server (GPL)
    springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:27.949  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:27.950  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.39]
    mysql-standalone_1_3deba3f11bd1 | 2020-11-05 15:41:28+00:00 [Note] [Entrypoint]: Temporary server started.
    springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:28.644  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:28.645  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2615 ms
    springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:28.939  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    mysql-standalone_1_3deba3f11bd1 | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
    mysql-standalone_1_3deba3f11bd1 | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
    mysql-standalone_1_3deba3f11bd1 | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
    mysql-standalone_1_3deba3f11bd1 | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
    springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:30.199 ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
    springboot-docker-container_1_39c0a7e72bdc | 
    springboot-docker-container_1_39c0a7e72bdc | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
    springboot-docker-container_1_39c0a7e72bdc | 
    springboot-docker-container_1_39c0a7e72bdc | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    springboot-docker-container_1_39c0a7e72bdc |    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.22.jar!/:8.0.22]
    springboot-docker-container_1_39c0a7e72bdc |    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.22.jar!/:8.0.22]
    springboot-docker-container_1_39c0a7e72bdc |    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) ~[mysql-connector-java-8.0.22.jar!/:8.0.22]
    springboot-docker-container_1_39c0a7e72bdc |    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.22.jar!/:8.0.22]

我的 travis.yml

sudo: required
language: generic

services:
  - docker
script:
  - mvn clean install -DskipTests=true
  - docker-compose -f docker-compose.yml up --build

dockerfile

From openjdk:8
ADD target/docker-mk.war docker-mk.war
EXPOSE 8085
ENTRYPOINT ["java", "-jar", "docker-mk.war"] 

docker-compose

version: '3'
services:
  mysql-standalone:
    image: mysql:5.7
    environment:
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_PASSWORD=root
      - MYSQL_DATABASE=demo
    ports:
      - 3307:3306
    healthcheck:
      test: mysqladmin ping -h mysql-standalone -u $$MYSQL_USER --password=$$MYSQL_PASSWORD
  springboot-docker-container:
    image: springboot-docker-container
    ports:
      - 8089:8085
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
         - mysql-standalone
               


Anything am missing or doing wrong here? 

【问题讨论】:

    标签: mysql spring-boot docker docker-compose travis-ci


    【解决方案1】:

    -depends-on: mysql-startalong只保证mysql容器在spring boot容器之前启动,不保证mysql服务器已经准备好连接。

    如果您使用现有数据库启动 mysql(这可能是您本地计算机上的情况,因为包含 mysql 数据的卷不会每次都清除,除非您明确这样做),一切都应该没问题;

    但是如果 mysql 是从头开始(travis 就是这种情况),mysql 需要一些时间来初始化帐户、数据库、配置等,并且在此期间尝试连接会导致错误。

    让我们看看你的日志,

        mysql-standalone_1_3deba3f11bd1 | 2020-11-05 15:41:28+00:00 [Note] [Entrypoint]: Temporary server started.
        springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:28.644  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
        springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:28.645  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2615 ms
        springboot-docker-container_1_39c0a7e72bdc | 2020-11-05 15:41:28.939  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
        mysql-standalone_1_3deba3f11bd1 | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
    

    当您的 spring 应用程序开始初始化时,mysql 刚刚启动了一个临时服务器并且仍在读取时区设置。因此引发了连接失败。

    至于解决方案,这里有一个来自 docker documention 的 Postgres 示例。

    此外,您可以在入口点文件中使用 netcat(记得将其安装在 dockerfile 中)检查端口,如下所示:

    #!bin/sh
    
    echo "Waiting for database..."
    while ! nc -z DATABASE_HOST DATABASE_PORT; do
        sleep 0.5
    done
    echo "Database started."
    
    java -jar YOURFILE
    
    exec "$@"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2020-10-13
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多