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

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

验证步骤

  1. 停止并清理现有容器:docker-compose down
  2. 重新启动服务:docker-compose up -d
  3. 查看Spring Boot容器日志:docker-compose logs spring-boot,确认无连接错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:02:42