无法通过Docker Compose连接到MySQL

后端开发 2026-07-09

我有一个Spring Boot微服务应用,它使用MySQL数据库来存储用户凭据和其他一些信息。

在我启动docker compose之后,所有服务都已就绪,但我无法访问数据库,始终收到相同的错误:

最后一次成功发送到服务器的数据包是在0 毫秒前。驱动程序尚未从服务器接收到任何数据包。org.springframework.dao.DataAccessResourceFailureException: 无法获取JDBC连接

另外,我也添加了我的docker compose文件。

我为服务使用YAML配置,并把凭据存储在 .env 中,但当我尝试把它们硬编码时,错误仍然存在。

如果不使用docker compose,而像普通Java程序那样直接运行,一切都正常。

在启动应用时,所有服务都处于就绪状态(我在Eureka中看到),并且可以访问登录页面,但无法登录。同时,当我向认证API发送请求时,返回401 Unauthorized,而不是200,尽管提供了有效凭据。

services:
  eureka-server:
    build: ./naming-server
    ports:
      - "8761:8761"

  db:
    image: mysql:latest
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: i_am_biker_db
      MYSQL_USER: biker
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql


  api-gateway:
    build: ./api-gateway
    ports:
      - "8765:8765"
    depends_on:
      - eureka-server
    env_file:
      - .env
    environment:
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/"

  web-service:
    build: ./web-service
    depends_on:
      - eureka-server
    env_file:
      - .env
    environment:
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/"

  maintenance-service:
    build: ./maintenance-service
    depends_on:
      - eureka-server
    env_file:
      - .env
    environment:
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/"

  bikes-service:
    build: ./bikes-service
    depends_on:
      - eureka-server
      - db
    env_file:
      - .env
    environment:
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/"
      DATASOURCE_URL: jdbc:mysql://db:3306/i_am_biker_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
      DATASOURCE_USERNAME: biker

  authentication-service:
    build: ./authentication-service
    ports:
      - "8900:8900"
    depends_on:
      - eureka-server
      - db
    env_file:
      - .env
    environment:
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/"
      DATASOURCE_URL: jdbc:mysql://db:3306/i_am_biker_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
      DATASOURCE_USERNAME: biker

volumes:
  mysql-data:

解决方案

这可能是一个竞态条件。我在客户端在MySQL数据库尚未就绪时尝试建立连接时,可以重现连接错误。这种情况在使用容器卷时更容易发生,而不仅仅是

- ./mysql-data:/var/lib/mysql

你可以尝试添加一个健康检查:

  db:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "biker", "-p${DB_PASSWORD}"]
      interval: 30s
      timeout: 10s
      retries: 5

  client:
    depends_on:
      db:
        condition: service_healthy
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章