使用docker-compose部署时Java容器无法连接MySQL容器报503错误求助
Docker环境Java服务连接MySQL 503错误排查与修复
核心错误点梳理
经过核对配置,可按以下优先级排查问题:
- 服务名拼写不匹配:docker-compose中MySQL服务名为
my_db,但Java服务配置的JDBC地址写为my-db,Docker内部DNS无法解析该域名导致连接失败 - 环境变量冲突不生效:Dockerfile中默认读取
DB_URL作为数据库连接地址,值为localhost:3306,但compose中传入的变量是spring.datasource.url,若Java代码未适配该变量,配置完全不生效;且容器内localhost指向Java服务自身,无法访问MySQL容器 - 数据库未自动初始化:MySQL容器配置中未声明
MYSQL_DATABASE参数,启动时不会自动创建lavagna库,Java服务连接时找不到目标库报错 - 启动时序问题:
depends_on仅控制容器启动顺序,无法保证MySQL初始化完成、可接受连接后再启动Java服务,易出现偶发连接失败 - 账号权限问题:若使用
root账号连接MySQL,默认仅允许容器本地登录,跨容器访问需要额外授权;也可直接使用你配置的普通用户eyal
具体修复方案
1. 修正docker-compose.yml配置
修改后完整配置如下:
version: "3.3" services: lavagna: build: . ports: - "8080:8080" networks: - back_net depends_on: my_db: condition: service_healthy environment: # 统一使用Dockerfile中定义的DB_前缀变量,确保配置生效 DB_URL: "jdbc:mysql://my_db:3306/lavagna?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" DB_USER: "root" DB_PASS: "123" my_db: image: mysql:5.7 ports: - "3306:3306" networks: - back_net volumes: - $PWD/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 123 MYSQL_USER: eyal MYSQL_PASSWORD: 123 # 新增参数,启动时自动创建lavagna库 MYSQL_DATABASE: lavagna # 新增健康检查,确保MySQL就绪后再启动Java服务 healthcheck: test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-p123"] timeout: 10s retries: 10 networks: back_net: driver: bridge
2. 可选优化Dockerfile配置
删除Dockerfile中重复的DB相关默认变量,避免本地构建测试时和容器环境配置冲突:
FROM openjdk:8-jre-alpine EXPOSE 8080 COPY ./target/. . COPY ./entrypoint.sh . ENV DB_DIALECT MYSQL ENV SPRING_PROFILE dev RUN apk update \ && apk add ca-certificates \ && update-ca-certificates && apk add openssl RUN chmod 774 entrypoint.sh ENTRYPOINT [ "./entrypoint.sh" ]
3. 验证修复效果
执行以下命令重新构建启动服务:
# 先清理旧的挂载卷,避免残留旧数据 docker-compose down -v # 重新构建启动 docker-compose up --build
启动完成后查看Java服务日志确认连接正常:
docker logs <你的lavagna容器ID>
如果仍有报错,可根据日志中的明确提示(如驱动版本不匹配、账号密码错误)进一步适配。
内容的提问来源于stack exchange,提问作者Eyal Solomon
相关产品推荐
相关产品推荐

