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
相关产品推荐
相关产品推荐

