部署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错误,结合你的配置,主要由以下几个问题导致:
- Dockerfile未执行Maven打包命令,镜像中不存在目标jar包,触发构建/启动异常
- MySQL容器间连接端口配置错误
- 未确保MySQL服务就绪后再启动Spring Boot应用
- 可能存在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
相关产品推荐
相关产品推荐

