You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose部署SpringBoot+MySQL失败:连接异常求助

问题描述

执行docker compose up时,后端SpringBoot服务与MySQL数据库服务启动失败,抛出**Communications link failure(通信链路失败)**错误。相关配置文件及错误信息如下:

Docker Compose 文件

version: '1'
services:
  mysqldb:
    build:
      context: ./database
      dockerfile: database.Dockerfile
    healthcheck:
      test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD
      start_period: 20s
      interval: 5s
      timeout: 10s
      retries: 55
    networks:
      - devNetwork

  springapp:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      mysqldb:
        condition: service_completed_successfully
    networks:
      - devNetwork
    environment:
      - MYSQL_URL=jdbc:mysql://mysqldb:3306/task_base?serverTimezone=UTC
      - MYSQL_USER=root
      - MYSQL_PASSWORD=mysql@sit

networks:
  devNetwork:
    driver: bridge

SpringBoot 服务 Dockerfile

FROM maven:3.8.3-openjdk-17
LABEL authors="Akkarawit"
COPY . ./backEndAPI
WORKDIR /backEndAPI
ENV MYSQL_URL=jdbc:mysql://mysqldb:3306/task_base?serverTimezone=UTC
ENV MYSQL_USER=root
ENV MYSQL_PASSWORD=mysql@sit
RUN echo "MYSQL_URL: $MYSQL_URL"
RUN echo "MYSQL_USER: $MYSQL_USER"
RUN echo "MYSQL_PASSWORD: $MYSQL_PASSWORD"
RUN mvn clean package
ENTRYPOINT ["java","-jar","/*.jar"]
EXPOSE 8080

MySQL 数据库 Dockerfile

FROM mysql/mysql-server:latest
COPY ./my.cnf /etc/
VOLUME ./mysql-lib /var/lib/mysql
COPY ./dbscript-v1.sql /docker-entrypoint-initdb.d/
ENV  MYSQL_ROOT_PASSWORD=mysql@sit
EXPOSE 3306

错误日志

37.14 [INFO] Running sit.int221.ItbKkApplicationTests
37.37 07:27:53.909 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [sit.int221.ItbKkApplicationTests]: ItbKkApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
37.57 07:27:54.070 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration sit.int221.ItbKkApplication for test class sit.int221.ItbKkApplicationTests
37.77 07:27:54.276 [main] INFO org.springframework.boot.devtools.restart.RestartApplicationListener -- Restart disabled due to context in which it is running
38.17 2024-04-24T07:27:54.711Z  INFO 69 --- [ITB-KK] [           main] sit.int221.ItbKkApplicationTests         : Starting ItbKkApplicationTests using Java 17.0.1 with PID 69 (started by root in /backEndAPI)
38.17 2024-04-24T07:27:54.719Z  INFO 69 --- [ITB-KK] [           main] sit.int221.ItbKkApplicationTests         : No active profile set, falling back to 1 default profile: "default"
39.57 2024-04-24T07:27:56.050Z  INFO 69 --- [ITB-KK] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
39.57 2024-04-24T07:27:56.113Z  INFO 69 --- [ITB-KK] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 54 ms. Found 1 JPA repository interface.
40.27 2024-04-24T07:27:56.781Z  INFO 69 --- [ITB-KK] [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
40.37 2024-04-24T07:27:56.847Z  INFO 69 --- [ITB-KK] [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.4.4.Final
40.37 2024-04-24T07:27:56.918Z  INFO 69 --- [ITB-KK] [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
40.77 2024-04-24T07:27:57.263Z  INFO 69 --- [ITB-KK] [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
40.77 2024-04-24T07:27:57.300Z  INFO 69 --- [ITB-KK] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
41.98 2024-04-24T07:27:58.510Z ERROR 69 --- [ITB-KK] [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
41.98
41.98 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
41.98
41.98 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
41.98   at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-j-8.3.0.jar:8.3.0]
41.98   at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.3.0.jar:8.3.0]
41.98   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815) ~[mysql-connector-j-8.3.0.jar:8.3.0]
41.98   at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438) ~[mysql-connector-j-8.3.0.jar:8.3.0]
41.98   at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.3.0.jar:8.3.0]
41.98   at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189) ~[mysql-connector-j-8.3.0.jar:8.3.0]
41.98   at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-5.0.1.jar:na]
41.98   at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[HikariCP-5.0.1.jar:na]
41.98   at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[HikariCP-5.0.1.jar:na]
41.98   at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) ~[HikariCP-5.0.1.jar:na]
41.98   at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-5.0.1.jar:na]
41.98   at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) ~[HikariCP-5.0.1.jar:na]
41.98   at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-5.0.1.jar:na]

排查与修复方案

1. 修正 depends_on 条件

当前配置中service_completed_successfully要求MySQL容器完全停止后才启动SpringBoot,这不符合实际需求。改为等待MySQL健康检查通过:

depends_on:
  mysqldb:
    condition: service_healthy

2. 修复MySQL健康检查命令

健康检查中使用的$$MYSQL_USER未在MySQL容器中定义,直接使用root用户:

healthcheck:
  test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD
  start_period: 20s
  interval: 5s
  timeout: 10s
  retries: 55

3. 确保MySQL允许外部连接

检查my.cnf配置,确保绑定地址为0.0.0.0(而非127.0.0.1),否则SpringBoot容器无法访问:

[mysqld]
bind-address = 0.0.0.0

4. 构建阶段跳过测试

当前mvn clean package会执行测试,但构建阶段无法访问MySQL容器,导致测试失败。修改命令:

RUN mvn clean package -DskipTests

5. 验证数据库初始化脚本

确保dbscript-v1.sql中正确创建task_base数据库:

CREATE DATABASE IF NOT EXISTS task_base;
USE task_base;

6. 检查MySQL容器日志

执行命令查看MySQL启动日志,确认是否有初始化错误:

docker logs <mysql-container-name>

7. 验证网络连通性

进入SpringBoot容器,ping MySQL服务名确认网络可达:

docker exec -it <springapp-container-name> ping mysqldb

内容的提问来源于stack exchange,提问作者anina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:20:53