Spring Boot Docker容器无法通过JDBC连接MySQL求助
Spring Boot无法连接Docker Compose中的MySQL数据库问题排查与解决
我用Docker Compose部署了Spring Boot、MySQL、Angular前端和Python推荐系统容器,前端和推荐系统运行正常,但Spring Boot后端一直报JDBC连接失败错误。尝试让Spring Boot容器连接同Compose下的MySQL容器,始终无法成功。
以下是针对性的排查和解决步骤:
优化MySQL健康检查逻辑
当前healthcheck仅检测MySQL进程存活,可能数据库尚未完成初始化(如指定库HealthAndFitnessPlatform未创建完成)。修改为直接验证数据库可访问:healthcheck: test: ["CMD-SHELL", "mysql -h localhost -u root -p12345678 -e 'USE HealthAndFitnessPlatform;'"] timeout: 20s retries: 10确认MySQL用户访问权限
进入MySQL容器,验证root用户是否允许外部访问:docker exec -it DataBaseContainer mysql -u root -p12345678执行查询:
SELECT host, user FROM mysql.user;若root用户的host不是
%,执行授权:ALTER USER 'root'@'%' IDENTIFIED BY '12345678'; FLUSH PRIVILEGES;用环境变量覆盖数据库配置
在Docker Compose的back-end服务中添加环境变量,避免硬编码配置可能带来的不一致:back-end: # 其他配置保持不变 environment: - SPRING_PROFILES_ACTIVE=dev - SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/HealthAndFitnessPlatform?useSSL=false&serverTimezone=UTC - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=12345678验证容器网络连通性
进入Spring Boot容器,测试与MySQL服务的网络连通:docker exec -it BackEndContainer ping database若ping不通,检查容器是否在同一网络:
docker network inspect common_network确认MySQL驱动是否存在
检查Spring Boot的pom.xml是否包含驱动依赖:<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency>确保打包后的jar包包含该依赖。
相关配置文件
Docker Compose配置
back-end: container_name: BackEndContainer build: context: . dockerfile: HealthAndFitnessPlatformJava/Dockerfile ports: - "8080:8080" networks: - common_network environment: - SPRING_PROFILES_ACTIVE=dev volumes: - ./target:/app depends_on: database: condition: service_healthy restart: unless-stopped database: container_name: DataBaseContainer image: mysql:latest ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: 12345678 MYSQL_DATABASE: HealthAndFitnessPlatform networks: - common_network volumes: - MYSQL_volume:/var/lib/mysql restart: unless-stopped healthcheck: test: [ "CMD-SHELL", "mysqladmin ping -h localhost -u root -p12345678" ] timeout: 20s retries: 10 front-end: container_name: FrontEndContainer build: context: . dockerfile: HealthAndFitnessPLatformNG/Dockerfile ports: - "4200:4200" networks: - common_network depends_on: - back-end restart: unless-stopped recommend: container_name: RecommendContainer build: context: ./HealthAndFitnessPYTHON dockerfile: Dockerfile networks: - common_network depends_on: - back-end restart: unless-stopped volumes: MYSQL_volume: networks: common_network: driver: bridge
Spring Boot Dockerfile
FROM openjdk:17-jdk-slim COPY HealthAndFitnessPlatformJava/target/HealthAndFitnessPlatform-0.0.1-SNAPSHOT.jar HealthAndFitnessPlatform.jar WORKDIR . CMD ["java","-jar","HealthAndFitnessPlatform.jar"]
application.properties配置
spring.application.name=HealthAndFitnessPlatform #MYSQL CONFIG spring.datasource.url=jdbc:mysql://database:3306/HealthAndFitnessPlatform spring.datasource.username=root spring.datasource.password=12345678 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #HIBERNATE CONFIGURATION spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-auto=update ## spring.jpa.show-sql=true #DEVTOOLS CONFIGURATION spring.devtools.restart.enabled=true #JWT CONFIGURATION jwt.key = c14f070c6c1fdc6905289a6a59f127611ceeb49481e25048c3dc1c9aa6ddbf5dec98114a2998ffbe33283a65e0445bdb6c4dcafe7f9c22c5367ea2c0c4ed8efd0304f302368ffc3ff3e4b46900f79e3dad4dfd9a430e3db3ea5cb1c35620d5c3e5d52359aab04cfb6824b5a6b2ae2bc694e9d62622ee3c53f1746c17b8b40fad #for uploading images file.upload-dir=uploads/images spring.servlet.multipart.max-file-size=5MB spring.servlet.multipart.max-request-size=5MB spring.datasource.hikari.initialization-fail-timeout=60000 spring.datasource.hikari.connection-timeout=30000
Angular Dockerfile
FROM node:alpine WORKDIR /usr/src/app COPY . /usr/src/app RUN npm install -g @angular/cli # 此处使用legacy-peer-deps参数强制解决依赖冲突 RUN npm install --legacy-peer-deps CMD ["ng", "serve", "--host", "0.0.0.0"]
Python推荐系统Dockerfile
FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "main.py"]
内容的提问来源于stack exchange,提问作者Ali Turgut
相关产品推荐
相关产品推荐

