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

部署Spring Boot+MySQL的Docker Compose报错:rpc error: EOF

解决Docker Compose构建Spring Boot镜像时的EOF错误及配置问题

核心错误分析

你遇到的failed to receive status: rpc error: code = Unavailable desc = error reading from server: EOF错误,结合你的配置,主要由以下几个问题导致:

  1. Dockerfile未执行Maven打包命令,镜像中不存在目标jar包,触发构建/启动异常
  2. MySQL容器间连接端口配置错误
  3. 未确保MySQL服务就绪后再启动Spring Boot应用
  4. 可能存在Docker构建缓存或网络通信问题

分步修复方案

1. 修复Dockerfile(关键)

你的Dockerfile仅复制了源码和pom文件,但未执行Maven打包,导致镜像中没有target/aifarming-0.0.1-SNAPSHOT.jar文件。改用多阶段构建,既完成打包又减小镜像体积:

# 构建阶段:完成Maven打包
FROM maven:3.8.3-openjdk-17 AS build
WORKDIR /home/app
COPY pom.xml .
COPY src ./src
# 执行打包命令,跳过测试加快构建
RUN mvn clean package -DskipTests

# 运行阶段:使用轻量JDK镜像运行应用
FROM openjdk:17-jdk-slim
WORKDIR /app
# 从构建阶段复制打包好的jar文件
COPY --from=build /home/app/target/aifarming-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

2. 修正Docker Compose中的MySQL连接配置

容器间通信使用内部端口,而非宿主机映射端口。修改spring-boot-container的环境变量:

SPRING_DATASOURCE_URL: jdbc:mysql://mysql-container:3306/world?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC

添加useSSL=false、allowPublicKeyRetrieval=true参数避免MySQL 8.x的连接限制,serverTimezone=UTC解决时区问题。

3. 确保MySQL服务就绪后启动Spring Boot

depends_on仅保证启动顺序,不确保MySQL服务就绪。给MySQL容器添加健康检查,并让Spring Boot等待健康状态:

# 在mysql-container服务中添加健康检查
mysql-container:
  image: mysql:latest
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: world
    MYSQL_USER: root
    MYSQL_PASSWORD: root
  ports:
    - 3307:3306
  volumes:
    - C:\Users\nayem\OneDrive\Desktop\docker-volumes:/path/in/container
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 10s
    timeout: 5s
    retries: 5

# 修改spring-boot-container的depends_on
spring-boot-container:
  # ...其他配置
  depends_on:
    mysql-container:
      condition: service_healthy

4. 清理Docker构建缓存与重启服务

如果上述修改后仍报错,清理构建缓存并重启Docker:

  • 清理缓存:执行命令 docker builder prune -f
  • 重启Docker服务:
    • Windows:右键任务栏Docker图标 → Restart
    • Linux:sudo systemctl restart docker

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:15:29