无法通过Docker Compose连接到MySQL
我有一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。