Docker Compose创建的Vaadin应用与MariaDB容器无法通信求助
问题解决:Vaadin容器无法连接MariaDB启动后退出
问题现象
使用Docker Compose部署Vaadin应用与MariaDB数据库时,Vaadin容器启动几秒后即退出,日志输出数据库连接被拒绝(Connection refused),即使配置自定义网络也无法解决该问题。
核心原因
depends_on仅能保证容器的启动顺序,无法确保MariaDB服务完全初始化就绪,Vaadin应用启动时数据库仍处于初始化状态,导致连接失败;此外,Hibernate方言配置与MariaDB版本不匹配也会引发兼容性问题。
解决方案
1. 给MariaDB添加健康检查,等待服务就绪后启动Vaadin
修改docker-compose.yml,为mariadb服务配置健康检查,同时让vaadin-app依赖数据库的健康状态,并添加失败重启机制:
version: "3.8" services: vaadin-app: build: context: . container_name: vaadin-app ports: - 8080:8080 depends_on: mariadb: condition: service_healthy # 等待数据库健康检查通过后再启动 restart: on-failure # 连接失败时自动重试启动 mariadb: image: "mariadb:10.5.8" container_name: mariadb environment: MYSQL_ROOT_PASSWORD: test MYSQL_DATABASE: Test MYSQL_USER: test2 MYSQL_PASSWORD: test2 volumes: - data:/var/lib/mysql ports: - 3306:3306 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ptest"] interval: 5s timeout: 5s retries: 5 volumes: data:
2. 修正Hibernate方言适配MariaDB版本
当前使用的MariaDB 10.5.8需匹配专用的MariaDB方言,而非MySQL8方言。修改application.properties:
# 替换原有MySQL8Dialect为对应版本的MariaDB方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB103Dialect
3. 可选:增强应用连接重试能力
若仍存在偶发连接问题,可在application.properties中添加数据库连接池的重试配置:
# 数据库连接池重试配置 spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.maximum-pool-size=5 spring.datasource.hikari.connection-test-query=SELECT 1
验证步骤
- 清理原有容器与数据卷:
docker-compose down -v - 重新构建并启动服务:
docker-compose up --build - 查看Vaadin容器日志确认连接成功:
docker logs vaadin-app
内容的提问来源于stack exchange,提问作者GörmenProgrammer
相关产品推荐
相关产品推荐

