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

更新:Docker容器内SpringBoot无法连数据库,疑Tomcat未启动

问题描述

[更新]:我发现真正的问题可能是Tomcat服务器未启动(仅在Jar包运行时出现,用IntelliJ运行一切正常)

我用docker-compose定义了两个服务:数据库和后端SpringBoot应用。本地运行应用连接数据库容器完全正常,但在Docker中运行时却无法连接数据库,我不确定问题到底出在哪,也没找到解决方案。

配置文件

docker-compose.yaml

version: '3'

services:
  mysql:
      image: mysql:8.0
      container_name: mysql
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: root
        MYSQL_PASSWORD: root
      ports:
        - "3306:3306"
      volumes:
        - mysql-data:/var/lib/mysql
      networks:
       - my_network

  backend:
    image: eclipse-temurin:17-jdk-jammy
    container_name: backend
    restart: no
    volumes:
      - ./backend/out/artifacts/backend_jar/:/app/
    ports:
      - '80:8080'
    command: /bin/sh -c "cd app && java -jar backend.jar || sleep 2073600"
    networks:
      - my_network

volumes:
  mysql-data:

networks:
  my_network:

application.properties

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:mysql}:3306/root
spring.datasource.username=root
spring.datasource.password=root

Docker运行日志

2024-02-05 09:30:57   .   ____          _            __ _ _
2024-02-05 09:30:57  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
2024-02-05 09:30:57 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2024-02-05 09:30:57  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
2024-02-05 09:30:57   '  |____| .__|_| |_|_| |_\\__, | / / / /
2024-02-05 09:30:57  =========|_|==============|___/=/_/_/_/
2024-02-05 09:30:57  :: Spring Boot ::                (v3.2.2)
2024-02-05 09:30:57 
2024-02-05 09:30:57 08:30:57.194 [main] INFO com.example.backend.BackendApplication -- Starting BackendApplication using Java 17.0.10 with PID 7 (/app/backend.jar started by root in /app)
2024-02-05 09:30:57 08:30:57.198 [main] INFO com.example.backend.BackendApplication -- No active profile set, falling back to 1 default profile: "default"
2024-02-05 09:30:57 08:30:57.959 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate -- Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-02-05 09:30:58 08:30:58.041 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate -- Finished Spring Data repository scanning in 69 ms. Found 4 JPA repository interfaces.
2024-02-05 09:30:58 08:30:58.508 [main] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Starting...
2024-02-05 09:30:58 08:30:58.757 [main] INFO com.zaxxer.hikari.pool.HikariPool -- HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:9ad12d1c-0bbc-4e56-82ed-3539a4fa97e5 user=SA
2024-02-05 09:30:58 08:30:58.759 [main] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Start completed.
2024-02-05 09:30:58 08:30:58.810 [main] INFO org.hibernate.jpa.internal.util.LogHelper -- HHH000204: Processing PersistenceUnitInfo [name: default]
2024-02-05 09:30:58 08:30:58.888 [main] INFO org.hibernate.Version -- HHH000412: Hibernate ORM core version [WORKING]
2024-02-05 09:30:58 08:30:58.931 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator -- HHH000026: Second-level cache disabled
2024-02-05 09:30:59 08:30:59.221 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo -- No LoadTimeWeaver setup: ignoring JPA class transformer
2024-02-05 09:30:59 08:30:59.941 [main] INFO org.hibernate.validator.internal.util.Version -- HV000001: Hibernate Validator null
2024-02-05 09:31:00 08:31:00.876 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator -- HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2024-02-05 09:31:00 08:31:00.933 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean -- Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-02-05 09:31:01 08:31:01.542 [main] INFO com.example.backend.BackendApplication -- Started BackendApplication in 4.587 seconds (process running for 4.92)
2024-02-05 09:31:01 08:31:01.550 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean -- Closing JPA EntityManagerFactory for persistence unit 'default'
2024-02-05 09:31:01 08:31:01.563 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Shutdown initiated...
2024-02-05 09:31:01 08:31:01.566 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Shutdown completed.
问题分析与解决办法

看日志就能发现,Spring Boot启动后直接用了H2内存数据库,根本没按配置连接MySQL,而且应用启动完立刻就关闭了。结合你提到的Tomcat未启动的情况,大概率是这几个问题:

1. Jar包没把配置文件打包进去

先解压你的backend.jar,看看BOOT-INF/classes下面有没有application.properties。要是没有,说明IntelliJ打包的时候漏了资源文件,去调整打包配置,确保把配置文件包含进去。

2. 后端启动太快,MySQL还没准备好

MySQL容器启动需要一点时间初始化,后端可能在MySQL还没就绪的时候就启动了,连不上就直接退出了。给docker-compose加个依赖和健康检查:
修改docker-compose.yaml里的mysql服务,添加健康检查:

mysql:
  image: mysql:8.0
  container_name: mysql
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: root
    MYSQL_PASSWORD: root
  ports:
    - "3306:3306"
  volumes:
    - mysql-data:/var/lib/mysql
  networks:
   - my_network
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 5s
    timeout: 5s
    retries: 5

然后给backend服务添加依赖,等MySQL健康后再启动:

backend:
  image: eclipse-temurin:17-jdk-jammy
  container_name: backend
  restart: no
  volumes:
    - ./backend/out/artifacts/backend_jar/:/app/
  ports:
    - '80:8080'
  command: /bin/sh -c "cd app && java -jar backend.jar || sleep 2073600"
  networks:
    - my_network
  depends_on:
    mysql:
      condition: service_healthy

3. 缺少MySQL驱动依赖

Spring Boot 3.x需要用MySQL 8.x的驱动,检查你的pom.xml或者build.gradle里有没有添加:
Maven添加以下依赖:

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle添加:

runtimeOnly 'com.mysql:mysql-connector-j'

要是没加,Jar包里就没有驱动,连不上MySQL就自动 fallback到H2内存数据库了。

4. 确认运行时加载的配置是否正确

启动Jar的时候加个参数,查看加载的配置是否正确:

java -jar backend.jar --debug

或者直接指定配置文件路径:

java -jar backend.jar --spring.config.location=file:/app/application.properties

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:57:33