Docker Compose无法读取.env文件,Spring Boot数据库连接失败求助
问题解决:Docker中Spring Boot应用数据库连接失败
核心问题定位
你遇到的Communications link failure错误,本质是数据库URL的主机名配置错误:在Docker容器内部,localhost指向容器自身,而非宿主机或MySQL服务容器。你的.env里用了localhost,导致Spring Boot容器尝试连接自己的3306端口,自然无法访问到MySQL服务。
分步解决方案
1. 修正.env中的数据库URL
把.env里的数据库URL改为Docker Compose中MySQL服务的名称(即mysql,对应你的Compose配置里的服务名):
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/db_name SPRING_DATASOURCE_USERNAME=username SPRING_DATASOURCE_PASSWORD=password API_KEY=apikey
2. 简化Spring Boot配置(可选)
你已经通过Docker Compose传递环境变量,spring.config.import=optional:file:.env[.properties]在容器中没有实际作用(容器内不存在宿主机的.env文件),可以从application.properties中移除,简化为:
spring.datasource.url=${SPRING_DATASOURCE_URL} spring.datasource.username=${SPRING_DATASOURCE_USERNAME} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} api.key=${API_KEY}
3. 优化Docker Compose的启动依赖(可选)
depends_on仅保证Spring Boot容器在MySQL容器之后启动,但不保证MySQL服务已经就绪。可以添加健康检查,确保MySQL服务可用后再启动Spring Boot:
version: '3.8' services: spring-boot: image: imagename ports: - "8090:8090" - "5005:5005" environment: SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL} SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME} SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD} API_KEY: ${API_KEY} depends_on: mysql: condition: service_healthy mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: db_name MYSQL_USER: username MYSQL_PASSWORD: password healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10
验证步骤
- 停止并清理现有容器:
docker-compose down - 重新启动服务:
docker-compose up -d - 查看Spring Boot容器日志:
docker-compose logs spring-boot,确认无连接错误
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

